Yii框架中有点意思的文件缓存

Yii框架中有点意思的文件缓存

在Yii框架的framework/caching目录下是Yii框架的所有缓存操作。包括文件缓存,APC缓存、Db缓存,Memcache缓存等。 今天我们要说的是文件缓存。

【文件和类结构】

它总共包括CFileCache.php、CCache.php和接口文件。 缓存基类CCache抽象类实现了CApplicationComponent类,ICache, ArrayAccess接口。 实现类CFileCache继承自CCache基类。其它如Memcache等缓存也是继承这个基类。 在ICache接口中统一缓存接口,在CCache基类中统一对外的接口,以类似于模板方法模式的方式将对于增加,修改,删除操作延迟到子类实现。

【缓存方案】

指定缓存目录,以一条数据一个文件的方式存储。序列化使用PHP自带的serialize函数。 如果缓存数据过多,作者建议使用多级目录,多级目录会自动生成,默认为0,即当前目录,推荐使用3级以下的子目录。 对于缓存过期是以文件的修改时间为准(filemtime函数)。在获取数据时,如果文件过期,则取的数据为空。

【有点意思的地方】

个人觉得有点意思的地方在于其对于过期缓存的批量处理,在程序中作者称其为garbage collection。 看其实现代码:

if(!$this->_gced && mt_rand(0,1000000)<$this->_gcProbability)
{
    $this->gc();    //  清除过期的缓存文件
    $this->_gced=true;
}

各位看官,你应该知道这段代码是啥意思了。 有点意思的地方是和PHP源码中对于session过期的处理。如下所示源码:

if (PS(mod_data) && PS(gc_probability) > 0) {
    int nrdels = -1;

    nrand = (int) ((float) PS(gc_divisor) * php_combined_lcg(TSRMLS_C));
    if (nrand < PS(gc_probability)) {
        //  调用定义的垃圾收集方法
        PS(mod)->s_gc(&PS(mod_data), PS(gc_maxlifetime), &nrdels TSRMLS_CC);
        ...
    }
}

对比下变量名,对比下调用方式。 ^_^

Yii框架中有点意思的文件缓存》上有4条评论

  1. Pingback引用通告: Thinking In LAMP Blog » Blog Archive » PHP每月通讯(2011年2月)

包菜兄进行回复 取消回复

电子邮件地址不会被公开。 必填项已用*标注


*

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>