首页 > php > yii > > 正文

Yii framework中的cache应用

发布人:zhoulujun@live.cn    点击:

做过大访问量网站的人都知道,缓存对网站性能的重要性,yii framework提供了一整套完整的类,程序员可以很方便的使用各种各样的cache。

    <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'=&gt;array(
        ......
        'cache'=&gt;array(
            'class'=&gt;'system.caching.CMemCache',
            'servers'=&gt;array(
                array('host'=&gt;'server1', 'port'=&gt;11211, 'weight'=&gt;60),
                array('host'=&gt;'server2', 'port'=&gt;11211, 'weight'=&gt;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()-&gt;cache来调用上面定义的class,存取数据的方法分别为set,get</p><p><br></p><p style="text-indent:2em;">存数据:</p><pre class="brush:php;toolbar:false;">// 缓存有效时间 30 seconds
Yii::app()-&gt;cache-&gt;set($id, $value, 30);</pre><p><br></p><p style="text-indent:2em;">取数据:</p><pre class="brush:php;toolbar:false;">$value=Yii::app()-&gt;cache-&gt;get($id);
if($value===false)
{
    // 缓存无效,走正常的取数据逻辑
    ......
    // 最后将数据存入缓存
    Yii::app()-&gt;cache-&gt;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()-&gt;cache;
$cache['var1']=$value1;  // 等价于: $cache-&gt;set('var1',$value1);
$value2=$cache['var2'];  // 等价于: $value2=$cache-&gt;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()-&gt;cache-&gt;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()-&gt;cache(1000, $dependency)-&gt;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...
&lt;?php if($this-&gt;beginCache($id, array('duration'=&gt;3600,'dependency'=&gt;array(
        'class'=&gt;'system.caching.dependencies.CDbCacheDependency',
        'sql'=&gt;'SELECT MAX(lastModified) FROM Post')))) { ?&gt;
...content to be cached...
&lt;?php $this-&gt;endCache(); } ?&gt;
...other HTML content...</pre><p style="text-indent:2em;">如果只希望缓存GET请求的页面内容,区块缓存里还支持requestType参数</p><pre class="brush:php;toolbar:false;">...other HTML content...
&lt;?php if($this-&gt;beginCache($id, array('requestTypes'=&gt;array('GET')))) { ?&gt;
...content to be cached...
&lt;?php $this-&gt;endCache(); } ?&gt;
...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'=&gt;100,
            'varyByParam'=&gt;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'=&gt;100,
               'varyByParam'=&gt;array('id'),
           ),
       );
   }</pre><p><br></p>    
延伸阅读: