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

其他

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

  • 最新随笔

  • 文章页也调整了下(图一旧,图二新)
  • 给首页调了下样式,图一旧版、图二新版。vibe coding之后,改起老项目反倒成了一种娱乐。
  • 昨天睡觉的时候反复梦到“人本主义”这个词,可是最近好像都没有相关的知识接触过,半梦半醒的时候还去搜了下具体含义,找了些视频看了下
  • 在AI时代尽可能在行业、学科的宽度上扩展,尽量尝试一些跨学科的事情、阅读一些跨学科的书籍和资料,应该会有很大收益。
  • 跟qoder和deepseek一起把之前想做的一些人生管理系统整合到博客上了,感觉还不错,顺便让它们帮我弄了一个数据大屏,放在平板上实时播放也不错。本来想单独做成独立的系统,想想感觉徒增维护成本,那就干脆合并到博客了。也能增加自己打开博客的频率,增加输出内容的概率。
  • 改了下首页的顶部banner,加了个背景图,新旧对比
  • 让qodercli改了改博客,这速度效率真的史无前例地高,连commit和push都交给它了。效果和claudeCode有的一比,用了一段时间,真的还可以。
  • 海洋公园逛逛(ps:北极熊馆动物状态都感觉不太好)