1环境准备
安装Memcached服务端:
yum -y installmemcached.x86_64
安装PHP-Memcache扩展:
yum -y installphp-pecl-memcache.x86_64
查看PHP-Memcache扩展是否安装成功:
php -m | grepmemcache
分别在11211和11212端口启动主从两个Memcached服务:
memcached -d -p 11211 -u memcached -m 64 -c1024 -P /var/run/memcached/memcached.pid
memcached -d -p 11212 -u memcached -m 64 -c1024 -P /var/run/memcached/memcached2.pid
具体参数含义如下:
-d选项是启动一个守护进程;
-m是分配给Memcache使用的内存数量;单位是MB;
-u是运行Memcache的用户,或者是root,
-l是监听的服务器IP地址;
-p是设置Memcache监听的端口;
-c选项是最大运行的并发连接数,默认是1024;
-P是设置保存Memcache的pid文件;保存在 /tmp/memcached.pid
通过Telnet客户端访问:
telnet 127.0.0.111211
telnet 127.0.0.111212
注:如果没有安装Telnet则先执行:
yum -y installtelnet.x86_64
也可以通过一个PHP文件测试PHP-Memcache扩展和Memcached服务是否连通:
memcache.php
===============================================================================
<?php
$memcache = new Memcache();
$memcache->connect('127.0.0.1', 11211);
$memcache->set('key', 'Memcache test successful!', 0, 60);
$result = $memcache->get('key');
unset($memcache);
echo $result;
?>
3配置Yii应用组件
Yii对Memcached提供直接支持,只需简单配置,就可以启用Memcached服务端作为Session服务器。
1.helloyii/protected/config/main.php
===============================================================================
array(
'components'=>array(
'cache'=>array(
'class'=>'CMemCache',
'servers'=>array(
array(
'host'=>'127.0.0.1',
'port'=>11211,
),
array(
'host'=>'127.0.0.1',
'port'=>11212,
),
),
),
'session' => array (
'class'=> 'CCacheHttpSession',
'cookieMode' => 'only',
'timeout' => 1200
),
),
)
2.helloyii/protected/controllers/CacheController.php
===============================================================================
class CacheController extends CController
{
public functionactionFetch($key, $value)
{
Yii::app()->session[$key]= $value;
echo'session:['.Yii::app()->session[$key].']';
Yii::app()->cache->set($key,$value);
$data =Yii::app()->cache->get($key);
Yii::app()->getController()->render('result',array('data'=>$data));
}
}
这个例子分别将键值对保存到session和缓存中。
(TODO)
如何对memcache的数据(key-value)进行遍历操作
http://www.cnblogs.com/sunli/archive/2008/11/01/1324153.html
利用shell命令操作Memcached[原创]
http://www.s135.com/post/384/
memcached命令行参数说明
http://blog.csdn.net/zzulp/article/details/7823511
参考资料
1 CentOS Memcache安装配置教程
http://www.bootf.com/442.html
2 Yii memcache 保存 session
http://blog.163.com/darwin_zhang/blog/static/12848873620127725122706/
1安装Redis
切换至/usr/local/src下,下载并安装redis:
$ wgethttp://redis.googlecode.com/files/redis-2.6.12.tar.gz
$ tar xzf redis-2.6.12.tar.gz
$ cd redis-2.6.12
$ make
进入redis-2.6.12目录,修改redis.conf:
daemonize yes
启动服务端:
$src/redis-server redis.conf
进入命令行验证服务是否启动:
$src/redis-cli
redis> set foo bar
OK
redis> get foo
"bar"
2安装Yii的Redis插件目前主要有两种Yii插件:
Ø Rediscache:基于predis(Redis的纯PHP实现客户端),无需安装Redis for PHP扩展。
Ø YiiRedis:基于phpredis客户端,需要安装Redis for PHP扩展。
这里采用Rediscache插件,避免线上安装Redis for PHP扩展。
2.1下载安装从以下地址下载Rediscache插件:
http://www.yiiframework.com/extension/rediscache/files/redis.zip
将插件解压到helloyii/app/protected/extensions中:
插件文件部署后的位置应为:helloyii/app/protected/extensions/redis/CredisCache.php
2.2配置Rediscache1.helloyii/app/protected/config/main.php
===============================================================================
return array(
'components' => array(
…
'cache'=>array(
'class'=>'ext.redis.CRedisCache', //对应protected/extensions/redis/CredisCache.php
'servers'=>array(
array(
'host'=>'127.0.0.1',
'port'=>6379,
),
),
),
),
…
);
3安装Yii的会话Redis插件 3.1下载安装从GitHub上下载插件https://github.com/lincsanders/PRedisCacheHttpSession
解压到helloyii/app/protected/extensions下:
插件文件部署后的位置应为:
helloyii/app/protected/extensions/PredisCacheHttpSession/PRedisCacheHttpSession.php
3.2配置PRedisCacheHttpSession'session'=>array(
'class' =>'ext.PRedisCacheHttpSession.PRedisCacheHttpSession',
'database' => 9,
),
注意:缓存和会话的database属性一定要区分开,用不同的Redis数据库来保存。
4编写控制器编写一个读写缓存的控制器进行测试。
2.helloyii/app/protected/controllers/CacheController.php
===============================================================================
class CacheController extends CController
{
public function actionFetch($key, $value)
{
Yii::app()->cache->set($key, $value);
$data = Yii::app()->cache->get($key);
Yii::app()->getController()->render('result',array('data'=>$data));
}
}
3.helloyii/app/protected/views/cache/result.php
===============================================================================
<?php
echo$data;
?>
现在访问:http://helloyii.com/app/index.php?r=cache/fetch&key=a&value=b
然后通过redis-cli命令行客户端查看下缓存的变化:
可以通过redis-cli客户端查看缓存:
$ src/redis-cli
redis> keys ‘*’
…
参考资料
1官方安装手册
http://redis.io/download
2 Yii的Redis插件1:rediscache
http://www.yiiframework.com/extension/rediscache/
3 Yii的Redis插件2:yiiredis
https://github.com/phpnode/YiiRedis
4 Yii CCache接口的API
http://www.yiichina.com/api/CCache#get-detail
5 Redis在YiiFramework中的使用
http://denghai260.blog.163.com/blog/static/726864092012323101628773/
1 MVC架构 1.1处理流程
一个Web请求在Yii内部的执行流程如下图所示:
组件名
角色与责任
index.php
入口脚本。创建Application的单例对象。
application
前端控制器。分析用户请求并将其分派到合适的控制器中以作进一步处理。它同时作为服务中心,维护应用级别的配置。
request
解析用户的请求。
urlManager
帮助application决定请求的控制器和动作。
controller
执行所请求的动作,动作通常会引入所必要的模型并渲染相应的视图,动作完成视图渲染并将其呈现给用户。
model
读取数据库或进行其他业务操作。
view
视图渲染出最终的页面。
1.3最佳实践
假设有这样一个包含几个子应用的Web应用,例如:
Ø Front-end:面向外部用户的Web站点
Ø Back-end:为管理员提供管理功能的Web站点
Ø Console:在终端中作为定时作业执行
Ø Web API:为第三方提供集成的API
1.3.1 ModelØ 包含代表特定数据的属性
Ø 包含业务逻辑、验证规则
Ø 包含操纵数据的代码
Ø 不应使用$_GET,$_POST等与界面类型绑定的变量
Ø 避免嵌入HTML等展示层代码
有时遵从第三条“包含操纵数据的代码”会让Model层变得很胖,因此可以为不同的子应用提供不同的Model子类。例如定义一个NewsBase类包含跨子应用共享的代码,为每个子应用实现自己的Model类,只包含针对当前子应用的代码。
1.3.2 ViewØ 包含展示代码,例如HTML和简单的遍历、格式化、渲染PHP代码
Ø 避免包含显示访问数据的代码
Ø 避免直接访问$_GET,$POST等变量
视图层的代码重用方式:
Ø 布局:公共展示区域(如页眉、页脚)可以放在一个布局视图中
Ø 部分视图:非布局代码的代码片段可以通过部分视图重用,例如表单代码
Ø 控件:如果部分视图中包含大量逻辑,就可以提取为控件类来重用。
Ø 助手类:完成细小任务的代码可以用助手类来重用,例如格式化数据,产生HTML标签
1.3.3 ControllerØ 可以访问$_GET,$_POST等PHP变量来获得用户请求
Ø 创建Model实例,并管理其生命周期
Ø 避免嵌入SQL语句
Ø 避免包含HTML等展示层代码
在设计良好的MVC应用程序中,控制器通过非常瘦,只包含几十行代码。然而模型层通常会很胖,因为它包含了不同领域的业务逻辑,满足特定的需求。
Yii 预定义了一系列核心应用组件,提供常见Web 应用中所用的功能。像【1.1组件角色】中的urlManager,【3数据访问】中将用到的CDbConnection,以及对Memcached支持等等都是通过可扩展的应用组件的形式加入到Yii中的。
2.1内置应用组件下面我们列出了由 CWebApplication 预定义的核心组件。
· assetManager: CAssetManager -管理私有资源文件的发布。
· authManager: CAuthManager -管理基于角色的访问控制(RBAC).
· cache: CCache -提供数据缓存功能。注意,你必须指定实际的类(例如CMemCache, CDbCache)。否则,当你访问此组件时将返回 NULL。
· clientScript: CClientScript -管理客户端脚本(javascripts 和CSS).
· coreMessages: CPhpMessageSource -提供 Yii 框架用到的核心信息的翻译。
· db: CDbConnection -提供数据库连接。注意,使用此组件你必须配置其 connectionString 属性。
· errorHandler: CErrorHandler