一、在配置文件中php
//在权威指南上是'cache' 其实能够根据不一样的缓存组件起不一样的名称 //memcache缓存 'memcache' => array( 'class' => 'system.caching.CMemCache', 'servers' => array( array('host' => '127.0.0.1', 'port' => 11211,'weight'=>40)), /* * yii中的memcache能够理解为在原始memcache的基础上进行的一种封装,好比将key值加密,这样更安全 * 可是原始的操做就不能用了,若是想用的话,须要下面的配置项 */ /* 'keyPrefix' => '', 'hashKey' => false, 'serializer' => false*/ ) , //数据库缓存 'dbcache'=>array( 'class'=>'system.caching.CDbCache', /* * 若是没有下面的connectionID 将会默认的使用sqlite 存储在runtime目录下; * 其中的db就是配置的db的数据库组件,这样会在对应的数据库自动创建数据表保存数据 */ 'connectionID'=>'db', ), //文件缓存 'filecache'=>array( 'class'=>'system.caching.CFileCache', //咱们使用CFileCache实现缓存,缓存文件存放在runtime文件夹中 'directoryLevel'=>'2', //缓存文件的目录深度 ), //APC缓存 /* * 在php5.5+版本 php集成opcache 有实验证实opcache性能要优于APC */ 'apccache' => 'system.caching.CApcCache', /* 'db'=>array( 'connectionString' => 'sqlite:'.dirname(__FILE__).'/../data/testdrive.db', ),*/
二、在控制器中操做html
/* * memcache缓存 */ public function actionMemcacheDemo(){ $key = 'address'; $value = 'china'; Yii::app()->memcache->set($key,$value); echo Yii::app()->memcache->get($key); } /* * 数据库缓存 */ public function actionDbcacheDemo(){ $key = 'test'; $value = "love"; Yii::app()->dbcache ->set($key, $value); echo Yii::app()->dbcache ->get($key); } /* * 文件缓存 */ public function actionFilecacheDemo(){ Yii::app()->filecache->set('name', 'maozedong'); $name = Yii::app()->filecache->get('name'); echo $name; } /* * APC缓存 */ public function actionApcDemo(){ Yii::app()->apccache->set('name', 'maozedong'); $name = Yii::app()->apccache->get('name'); echo $name; }
开始很疑惑,这个APC在个人印象中是加速php中间码的,怎么也能够用来用来存储一个数据呢?探究一番以后原来,APC的缓存分两部分,系统缓存和用户缓存。参考文章:http://blog.csdn.net/liuxinmingcode/article/details/8058864git
系统缓存 它是指APC把PHP文件源码的编译结果缓存起来,而后在每次调用时先对比时间标记。若是未过时,则使用缓存的中间代码运行。默认缓存 3600s(一小时)。可是这样仍会浪费大量CPU时间。所以能够在php.ini中设置system缓存为永不过时(apc.ttl=0)。不过若是这样设置,改运php代码后须要重启WEB服务器。目前使用较多的是指此类缓存。 用户数据缓存 缓存由用户在编写PHP代码时用apc_store和apc_fetch函数操做读取、写入的。若是数据量不大的话,能够一试。若是数据量大,使用相似memcache此类的更
由于opcache的性能要比apc好不少,因此下面的apc略过,用opcache来代替。github
上面都是保存的单个的数据,其中memcache缓存将数据放到内存里,数据库缓存将数据放在一个表里,文件缓存将数据放在文件里,文件在runtime目录下。sql
三、片断缓存数据库
<!--控制器中--> <?php /* * 片断缓存 在pageList数据表中取出10条数据 */ public function actionPartCache(){ $page_result = Pagelist::model()->findAll(array( 'order' => 'id desc', 'limit' => 10, 'offset' => 0, )); $this->render('partcache',array('page_result'=>$page_result)); } ?> <!--视图文件中--> <?php if($this->begincache('123123', array('duration'=>3600))) { ?> <?php foreach($page_result as $value){ echo $value->title."<br/>"; }?> <?php $this->endcache(); } ?>
我从一个表中取出10条数据进行缓存,可是尝试了不少次无效。。。最后是更改了配置文件中,文件缓存的名字为cache,这下能够了缓存
//文件缓存 'cache'=>array( 'class'=>'system.caching.CFileCache', //咱们使用CFileCache实现缓存,缓存文件存放在runtime文件夹中 'directoryLevel'=>'2', //缓存文件的目录深度 ),
看来是有相互的依赖性,yii并无提供beginfilecache,因此必须将文件缓存的配置名为cache。片断缓存是在runtime目录下的cache文件夹。安全
四、文件缓存服务器
文件缓存是在控制里的filter方法里session
public function filters() { return array ( array ( 'COutputCache + post, list', 'duration' => 3600, 'varyByParam' => array('id','page'), );
'dependency' => array(
'class'=>'CDbCacheDependency',
'sql'=>'SELECT MAX(id) FROM me115_book',
)
}
COutputCache 是用于处理缓存的类,若是只填'COutputCache',则控制器里全部action都会经过缓存过滤,定义'COutputCache + post, list',表示只对如下方法进行缓存:actionPost, actionList
duration 是缓存的时间,单位是秒,
varyByParam 是指定一系列GET参数名称列表, 使用相应的值去肯定缓存内容的版本,即同一个action用于区分是不一样页面的的参数,此处我以id和page来区分不一样页面。
除varyByParam之外,还能够采用其余的条件来区分页面:
varyByExpression:指定缓存内容经过自定义的PHP表达式的结果而变化
varyByRoute:指定缓存内容基于请求的路由不一样而变化 (controller 和 action)
varyBySession:指定是否缓存内容. 因用户session不一样而变化
dependency'指定缓存失效依赖关系:可指定文件或数据库;本文采用的是数据库依赖CDbCacheDependency;
本例指定的是数据库,经过数据表的某个值的变化来肯定缓存是否失效。例如,若是在表中新增了一条me115_book记录,即便缓存才过了2分钟(<3600),仍然判断为失效,从而查询数据库,生成整个页面,再次缓存。
参考文章:http://www.cnblogs.com/me115/archive/2012/12/17/2821184.html
五、关于opcache
在php.ini中引入opcache
能够在界面看到opcache的效率的插件,地址https://github.com/SchumacherFM/Magento-OpCache
在yii中没必要配置直接可使用
六、缓存时间 缓存依赖
单个数据缓存 时间依赖
//文件缓存 时间依赖 public function actionFileDemo(){ // Yii::app()->cache->set('address','henan',10); $value = Yii::app()->cache->get('address'); if($value === false){ Yii::app()->cache->set('address','shanghai',10); $value=Yii::app()->cache->get('address'); } echo $value; } //数据库缓存 时间依赖 public function actionDbTime(){ // Yii::app()->dbcache->set('school','yuanlu',20); $value = Yii::app()->dbcache->get('school'); if($value === false){ Yii::app()->dbcache->set('school','lema',20); $value = Yii::app()->dbcache->get('school'); } echo $value; } //memcache缓存 时间依赖、 public function actionMemTime(){ // Yii::app()->memcache->set('teacher','yuan',20); $value = Yii::app()->memcache->get('teacher'); if($value === false){ Yii::app()->memcache->set('teacher','zhang',20); $value = Yii::app()->memcache->get('teacher'); } echo $value; }
文件和目录依赖
public function actionFileDemo(){ // Yii::app()->cache->set('address333','henan444',new CFileCacheDependency(Yii::app()->basePath.'\controller\PagelistController.php')); $value = Yii::app()->cache->get('address333'); if($value === false){ Yii::app()->cache->set('address333','shanghai333', new CFileCacheDependency(Yii::app()->basePath.'\controller\PagelistController.php')); $value=Yii::app()->cache->get('address333'); } echo $value; // echo Yii::app()->basePath.'\controller\PagelistController.php'; //echo Yii::app()->basePath; } public function actionFileDemo(){ // Yii::app()->cache->set('address333','henan444',new CFileCacheDependency(Yii::app()->basePath.'\controller\PagelistController.php')); // Yii::app()->cache->set('addressml','henan444',new CFileCacheDependency(Yii::app()->basePath.'\config')); Yii::app()->cache->set('addressml','henan444',new CFileCacheDependency(Yii::app()->basePath.'\config')); $value = Yii::app()->cache->get('addressml'); if($value === false){ Yii::app()->cache->set('addressml','shanghai333', new CFileCacheDependency(Yii::app()->basePath.'\config')); $value=Yii::app()->cache->get('addressml'); } echo $value; // echo Yii::app()->basePath.'\controller\PagelistController.php'; //echo Yii::app()->basePath; }
片断缓存依赖
<?php if($this->begincache('123123', array( 'duration'=>3600, 'dependency'=>array( 'class'=>'system.caching.dependencies.CDbCacheDependency', 'sql'=>'select max(id) from pagelist', ), ))) { ?> <?php foreach($page_result as $value){ echo $value->title."<br/>"; }?> <?php $this->endcache(); } ?> //能够设置过时时间 duration //设置依赖过时时间 配置dependency 若是数据表中pagelist中的最大的id发生变化,则更新缓存的内容。