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的对缓存的处理可以更加完善一些,每个缓存的驱动给出相同的接口。现在这种接口的参数相当的混乱,会给人造成一些误导。
订阅
PHPCMSV9 乱解读 之 PHPCMS V9的MVC
PHPCMS乱解读之 pc标签的实现

文章来自:
Tags: