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

其他

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

  • 最新随笔

  • 整个博客全面ai化,所有文章、随笔、知识库、习惯、目标、任务、清单、随记等全部工具化,让ai调用接管含人生管理系统在内的整个博客,完成。 让ai有更完整的上下文,更全面的视野,能产生更大能量
  • 给吉他网 vibe coding 了个吉他工具箱 (๑•̀ㅂ•́)و✧
  • 海边
  • 增加一些流动的云
  • 文章页也调整了下(图一旧,图二新)
  • 给首页调了下样式,图一旧版、图二新版。vibe coding之后,改起老项目反倒成了一种娱乐。
  • 昨天睡觉的时候反复梦到“人本主义”这个词,可是最近好像都没有相关的知识接触过,半梦半醒的时候还去搜了下具体含义,找了些视频看了下
  • 在AI时代尽可能在行业、学科的宽度上扩展,尽量尝试一些跨学科的事情、阅读一些跨学科的书籍和资料,应该会有很大收益。