对于一些不会经常变化的数据,或者每次调用需要进行多次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中,这样一来即可全局使用。任何你需要增加缓存功能的函数,直接使用它即可。如果你不喜欢先写一个普通函数,再写一个带缓存的函数,也可以直接在普通函数中写一个匿名函数,然后传入装饰器中,这样这个函数也可以直接增加缓存功能。

其他

一些功能复杂或者内容丰富的页面,往往数据库查询数量较多,几十次都有可能,数量较多会拖慢页面的加载速度,增加服务器负载,而整理出一些变化较不频繁或者多个页面相同的部分数据,整合到同一个缓存中,减少数据库查询,对于服务访问速度会有较为明显的提升。

评论

Felix 管理员

很多事情还是没必要深究意义,重在过程,不问结果。光是写作的这个过程就挺让人身心愉悦的。哈哈,随缘发吧!!

回复

  • 最新随笔

  • 中秋经典BGM:滴滴滴
  • 猫确实喜欢在各种犄角旮旯里睡觉
  • 尝试让DALLE生成一些连续的精灵图,让gpt帮忙生成一些提示词,如果能稳定输出的话就很强大了。
    让gpt帮忙生成的DALLE提示词
    "Generate a pixel art sprite sheet of a character walking in four directions (north, south, east, west) in a retro video game style."
    "Create a series of pixel art frames showing a character performing different actions like walking, running, jumping, and attacking in a classic 2D game aesthetic."
  • 路过别人山庄的门口,被一条大黑狗边叫边追过来,幸好骑电动车,不然还不一定跑得过,哈哈哈哈哈哈哈哈哈哈。
  • 最近两周也没咋出去玩,主要也是觉得没啥好玩的(笑哭)。看完布莱恩阿瑟的《复杂经济学》后,里面那个酒吧问题勾起我的兴趣,最近空了就花了些时间实现个python版本,顺便搞了篇博文,很享受这种新知识能和已有知识碰撞的感觉。(配张前段时间拍的图片,梧桐山门口前面那条路,挺漂亮的)
  • 盐田港夜景
  • 为啥这猫总喜欢喝杯子里的水
  • 确实开始冷了,在树林里至少要比人类聚集区低个几度,进出入口就能很明显感觉到。看看深圳水库的风景,貌似后面的视野更开阔。