PHPCMS乱解读之phpcmsv9中的缓存

标 题: 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的对缓存的处理可以更加完善一些,每个缓存的驱动给出相同的接口。现在这种接口的参数相当的混乱,会给人造成一些误导。



文章来自: 本站原创
Tags:
评论: 0 | 查看次数: 15398