对于一些不会经常变化的数据,或者每次调用需要进行多次sql查询(比如调用一次就需要查十几次数据库)的数据,就可以给这些数据增加缓存,将多次查询合并到一个缓存中,加载速度就会大大加快,而phpcms本身就自带了设置缓存和调用缓存的函数setcache和getcache,我们就基于这两个函数写一个装饰器,给普通的函数非常简单地增加上一个缓存的功能。
#缓存装饰器,用于给函数结果增加缓存
function cacheDecorator($func,$cache_key,$expires=3600,$cache_type="commons"){
return function(...$args) use ($func,$cache_key,$expires,$cache_type){
$cache=getcache($cache_key,$cache_type);
$use_cache=false;
if($cache){
if($cache['expires']>time()){
$use_cache=true;
$data=$cache['data'];
}
}
if(!$use_cache){
$data=$func(...$args);
setcache($cache_key,array("data"=>$data,"expires"=>time()+$expires),$cache_type);
}
return $data;
};
}
这个装饰器函数,接受的参数包括:需要被装饰的函数、缓存名称、过期时间、缓存文件夹。
首先尝试getcache,并判断时间,如果不存在缓存,或者缓存过期了,就调用原函数,获取结果,存入缓存,然后返回结果。
接下来,我们来看看如何使用吧。
首先需要有一个函数,比如我们写一个数据库查询的获取某个列表的文章的函数
function getArticle_base($catid){
$db = pc_base::load_model('content_model');
$db->query("SELECT * FROM v9_news WHERE status=99 AND catid=".$catid);
$articles=$db->fetch_array();
return $articles;
}
然后我们将这个函数传入到装饰器中,输出到一个变量中,这个变量就是一个带缓存功能的函数了。
//带缓存版本
function getArticle($catid){
$func=cacheDecorator(getArticle_base,"articles_".$catid);
$data = $func($catid);
return $data;
}
这样一来,该函数就增加上了一小时的缓存。这个装饰器函数可以放在 libs/functions/extention.func.php
中,这样一来即可全局使用。任何你需要增加缓存功能的函数,直接使用它即可。如果你不喜欢先写一个普通函数,再写一个带缓存的函数,也可以直接在普通函数中写一个匿名函数,然后传入装饰器中,这样这个函数也可以直接增加缓存功能。
一些功能复杂或者内容丰富的页面,往往数据库查询数量较多,几十次都有可能,数量较多会拖慢页面的加载速度,增加服务器负载,而整理出一些变化较不频繁或者多个页面相同的部分数据,整合到同一个缓存中,减少数据库查询,对于服务访问速度会有较为明显的提升。