Yii framework中的cache应用
Author:[email protected] Date:
<p style="text-indent:2em;">做过大访问量网站的人都知道,缓存对网站性能的重要性,yii framework提供了一整套完整的类,程序员可以很方便的使用各种各样的cache。<br></p><p><br></p><h2>Yii cache的配置</h2><p>首先需要在配置文件的components数组中添加cache的相关配置</p><pre class="brush:php;toolbar:false;">array(
......
'components'=>array(
......
'cache'=>array(
'class'=>'system.caching.CMemCache',
'servers'=>array(
array('host'=>'server1', 'port'=>11211, 'weight'=>60),
array('host'=>'server2', 'port'=>11211, 'weight'=>40),
),
),
),
);</pre><p><br></p><p style="text-indent:2em;">其中class指定了缓存的类型,yii支持以下几种缓存类型:</p><p><br></p><ul style="list-style-type:disc;"><li><p>CMemCache: memcache缓存,依赖于 PHP memcache extension.</p></li><li><p>CApcCache: Apc缓存,依赖于PHP APC extension.</p></li><li><p>CXCache: XCache缓存,依赖于 PHP XCache extension.</p></li><li><p>CEAcceleratorCache: EAccelerator,依赖于PHP EAccelerator extension.</p></li><li><p>CDbCache: 数据库缓存,默认情况下Yii会在runtime目录下建立一个SQLite3的数据库并使用它存储缓存内容,当然也可以通过设置该类的connectionID属性来使用其他类型的数据库.</p></li><li><p>CZendDataCache: 用Zend Data Cache来存储缓存内容.</p></li><li><p>CFileCache: 文件缓存,特别适合于存储大文件的缓存.</p></li><li><p>CDummyCache: 这个缓存是Yii特别贴心的一种缓存,用这种缓存的时候,其实根本没有缓存任何东西,特别方便开发人员在开发新功能时排出缓存的影响,并且在部署时,如果底层缓存系统出故障了,可以临时切换到此缓存,代码不需要做任何修改。</p></li></ul><p><br></p><h2>缓存数据的存与取<br></h2><p style="text-indent:2em;">在代码中直接使用Yii::app()->cache来调用上面定义的class,存取数据的方法分别为set,get</p><p><br></p><p style="text-indent:2em;">存数据:</p><pre class="brush:php;toolbar:false;">// 缓存有效时间 30 seconds
Yii::app()->cache->set($id, $value, 30);</pre><p><br></p><p style="text-indent:2em;">取数据:</p><pre class="brush:php;toolbar:false;">$value=Yii::app()->cache->get($id);
if($value===false)
{
// 缓存无效,走正常的取数据逻辑
......
// 最后将数据存入缓存
Yii::app()->cache->set($id,$value,$cacheTime);
}</pre><p><br></p><p><span style="color:#FF0000;">注意:</span>由于缓存基类CCache实现了ArrayAccess接口,可以方便以数组存取的方式进行缓存数据的存取</p><pre class="brush:php;toolbar:false;">$cache=Yii::app()->cache;
$cache['var1']=$value1; // 等价于: $cache->set('var1',$value1);
$value2=$cache['var2']; // 等价于: $value2=$cache->get('var2');</pre><p><br></p><h2>缓存依赖</h2><p style="text-indent:2em;">对于绝大多数的应用来说,上面介绍的基础的存取已经能够满足业务需求。</p><p style="text-indent:2em;">除了上述基础存取,Yii framework还支持缓存依赖,何为缓存依赖?比如我们生成的缓存内容是由多个文件拼装而成的,如果其中一个文件的内容发生了变化,那缓存就应该更新,这个就叫做缓存依赖。</p><p><br></p><p>Yii支持以下几种缓存依赖</p><ul style="list-style-type:disc;"><li><p>CFileCacheDependency: 文件修改依赖.</p></li><li><p>CDirectoryCacheDependency: 目录修改依赖.</p></li><li><p>CDbCacheDependency: sql查询结果的依赖.</p></li><li><p>CGlobalStateCacheDependency: 全局变量的依赖,变量通过来 CApplication::setGlobalState()来改变.</p></li></ul><p><br></p><p>代码举例:</p><p>文件修改依赖</p><pre class="brush:php;toolbar:false;">// 默认缓存 30秒
// 如果FileName发生改变,缓存立即失效
Yii::app()->cache->set($id, $value, 30, new CFileCacheDependency('FileName'));</pre><p>sql查询结果依赖</p><p><br></p><pre class="brush:php;toolbar:false;">$dependency = new CDbCacheDependency('SELECT MAX(update_time) FROM tbl_post');
$posts = Post::model()->cache(1000, $dependency)->findAll();</pre><p><br></p><h2>页面区块缓存</h2><p><br></p><p style="text-indent:2em;">区块缓存是指页面中的某一部分数据可以长时间缓存,比如某个页面中有一个小区块是去年数据统计列表,这些数据是固定不变的,那么可以利用Yii提供的页面区块缓存来实现。</p><p><br></p><p style="text-indent:2em;">页面区块缓存的起始位置用 CController::beginCache() 和 CController::endCache() 两个方法来定义。</p><p style="text-indent:2em;">一般会将这部分代码写在view页面脚本中。</p><p><br></p><p style="text-indent:2em;">代码使用举例:</p><pre class="brush:php;toolbar:false;">..other HTML content...
<?php if($this->beginCache($id, array('duration'=>3600,'dependency'=>array(
'class'=>'system.caching.dependencies.CDbCacheDependency',
'sql'=>'SELECT MAX(lastModified) FROM Post')))) { ?>
...content to be cached...
<?php $this->endCache(); } ?>
...other HTML content...</pre><p style="text-indent:2em;">如果只希望缓存GET请求的页面内容,区块缓存里还支持requestType参数</p><pre class="brush:php;toolbar:false;">...other HTML content...
<?php if($this->beginCache($id, array('requestTypes'=>array('GET')))) { ?>
...content to be cached...
<?php $this->endCache(); } ?>
...other HTML content...</pre><p><br></p><h2>整个页面缓存</h2><p><br></p><p style="text-indent:2em;">要想利用yii framework实现整个页面缓存,我们可以借助COutputCache filter来实现,通过简单的配置就可以实现</p><p><br></p><pre class="brush:php;toolbar:false;">public function filters()
{
return array(
array(
'COutputCache',
'duration'=>100,
'varyByParam'=>array('id'),
),
);
}</pre><p><br></p><p style="text-indent:2em;">上面的配置将会影响controller里的所有action,如果只想在某些action里起作用,可以利用filter的+、-操作符来限定影响的action</p><p style="text-indent:2em;">例如</p><pre class="brush:php;toolbar:false;">public function filters()
{
return array(
array(
'COutputCache + test',
'duration'=>100,
'varyByParam'=>array('id'),
),
);
}</pre><p><br></p>
转载本站文章《Yii framework中的cache应用》,
请注明出处:https://www.zhoulujun.cn/html/php/yii/2015_0729_203.html
下一篇:最后一页