PHPCMS乱解读之phpcmsv9中的缓存
作者:admin 日期:2013-07-09
标 题: PHPCMS乱解读之phpcmsv9中的缓存
作 者: web开发网[http://www.zeroplace.cn]
时 间: 2013/07/00 08:15:00
链 接: http://www.zeroplace.cn/article.asp?id=854
说 明: 转载请保留本段文字
在 PHPCMSV9 乱解读 之 PHPCMS V9的MVC 这篇文章中有看到一组global.func.php中的函数,但是那时候没有细讲。
/** * 写入缓存,默认为文件缓存,不加载缓存配置。 * @param $name 缓存名称 * @param $data 缓存数据 * @param $filepath 数据路径(模块名称) caches/cache_$filepath/ * @param $type 缓存类型[file,memcache,apc] * @param $config 配置名称 * @param $timeout 过期时间 */ function setcache($name, $data, $filepath="', $type='file', $config='', $timeout=0) { pc_base::load_sys_class('cache_factory','',0); if($config) { $cacheconfig = pc_base::load_config('cache'); $cache = cache_factory::get_instance($cacheconfig)->get_cache($config); } else { $cache = cache_factory::get_instance()->get_cache($type); } return $cache->set($name, $data, $timeout, '', $filepath); } /** * 读取缓存,默认为文件缓存,不加载缓存配置。 * @param string $name 缓存名称 * @param $filepath 数据路径(模块名称) caches/cache_$filepath/ * @param string $config 配置名称 */ function getcache($name, $filepath='', $type='file', $config='') { pc_base::load_sys_class('cache_factory','',0); if($config) { $cacheconfig = pc_base::load_config('cache'); $cache = cache_factory::get_instance($cacheconfig)->get_cache($config); } else { $cache = cache_factory::get_instance()->get_cache($type); } return $cache->get($name, '', '', $filepath); }
/** * 删除缓存,默认为文件缓存,不加载缓存配置。 * @param $name 缓存名称 * @param $filepath 数据路径(模块名称) caches/cache_$filepath/ * @param $type 缓存类型[file,memcache,apc] * @param $config 配置名称 */ function delcache($name, $filepath="', $type='file', $config='') { pc_base::load_sys_class('cache_factory','',0); if($config) { $cacheconfig = pc_base::load_config('cache'); $cache = cache_factory::get_instance($cacheconfig)->get_cache($config); } else { $cache = cache_factory::get_instance()->get_cache($type); } return $cache->delete($name, '', '', $filepath); } /** * 读取缓存,默认为文件缓存,不加载缓存配置。 * @param string $name 缓存名称 * @param $filepath 数据路径(模块名称) caches/cache_$filepath/ * @param string $config 配置名称 */ function getcacheinfo($name, $filepath='', $type='file', $config='') { pc_base::load_sys_class('cache_factory'); if($config) { $cacheconfig = pc_base::load_config('cache'); $cache = cache_factory::get_instance($cacheconfig)->get_cache($config); } else { $cache = cache_factory::get_instance()->get_cache($type); } return $cache->cacheinfo($name, '', '', $filepath); }
这就是v9中用来写入和读取缓存的一组函数。
观察这组函数可以发现它们其实是通过cache_factory->get_cache方法获取了一个$cache的实例,然后再对这个$cache调用set/get方法而已。cache_factory是pc_base::load_sys_class来载入的,所以它所在的文件应该是位于libs/classes/cache_factory.php。来看一下cache_factory->get_cache。
/** * 获取缓存操作实例 * @param $cache_name 缓存配置名称 */ public function get_cache($cache_name) { if(!isset($this->cache_list[$cache_name]) || !is_object($this->cache_list[$cache_name])) { $this->cache_list[$cache_name] = $this->load($cache_name); } return $this->cache_list[$cache_name]; }
这段代码只是简单的对cache_factory->load的调用并做了一个缓存以减少调用次数。现在来看cache_factory->load这个方法。
/** * 加载缓存驱动 * @param $cache_name 缓存配置名称 * @return object */ public function load($cache_name) { $object = null; if(isset($this->cache_config[$cache_name]["type'])) { switch($this->cache_config[$cache_name]['type']) { case 'file' : $object = pc_base::load_sys_class('cache_file'); break; case 'memcache' : define('MEMCACHE_HOST', $this->cache_config[$cache_name]['hostname']); define('MEMCACHE_PORT', $this->cache_config[$cache_name]['port']); define('MEMCACHE_TIMEOUT', $this->cache_config[$cache_name]['timeout']); define('MEMCACHE_DEBUG', $this->cache_config[$cache_name]['debug']); $object = pc_base::load_sys_class('cache_memcache'); break; case 'apc' : $object = pc_base::load_sys_class('cache_apc'); break; default : $object = pc_base::load_sys_class('cache_file'); } } else { $object = pc_base::load_sys_class('cache_file'); } return $object; }
可以发现这个方法里面就是根据$cache_name这个变量来加载不同的缓存驱动。这里的驱动也就是pc_base::load_sys_class加载进来的一个类,但是由于在setcache和getcache中要分别用到这个驱动的set和get的方法,所以这这驱动必需要实现这两个方法。个人认为在这里v9应该要给出一个abstract类来供开发者继承?
从上面这个函数可以看出来v9支持三种缓存: file, memcache, apc。 但实际上apc这个缓存在v9里面没有真正被实现,因为在libs/classes/中是找不到cache_apc.php这个文件的。 本文一开始所列的4个函数中,实际上对文件缓存是都有效的,最后一个getcacheinfo对memcache实际上是没有效果的,将会报错。
总结:
个人认为phpcmsv9的对缓存的处理可以更加完善一些,每个缓存的驱动给出相同的接口。现在这种接口的参数相当的混乱,会给人造成一些误导。