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); ... } }
对比下变量名,对比下调用方式。 ^_^