yii2.0.14 新增了一个行为叫 CacheableWidgetBehavior

阅读 70
收藏 3
2018-03-07
原文链接:nai8.me
2018年03月07日 14时00分

我们知道yii2内置了很多行为,比如时间戳自动更新、自动赋值登录会员ID的,具体可以参考我之前写的 Yii2行为研究 专题,在2.0.14版上又增加了这个 CacheableWidgetBehavior 行为。

用意很简单,可以将一个小挂件缓存下来,行为对配置要求非常低,通常情况下你只需支持cache组件即可。

接下来我用最简单的语言写个小教程,希望可以为你抛砖引玉。

话说一个风和日丽的早上,我的老板给我说了如下需求:

小阿北啊,你给咱网站做个最新发帖10条的区块吧。 🐸🐸🐸🐸 好的。

既然是一个区块,我自然想到了小挂件,说干咱就干,于是我写下了如下代码

构造小挂件

我新建了一个小挂件叫NewPost.php

// @app/components/NewPost.php
namespace app\components;

use yii\base\Widget;
use app\models\Post;
class NewPost extends Widget {

    public function init(){
        parent::init();
    }

    public function run(){
        parent::run();

        $data = Post::find()->orderBy(["created_at"=>SORT_DESC])->limit(10)->all();

        return $this->render('new_post',[
            'data'=>$data
        ]);
    }
}

然后在 @app/components/views 下建立对应的视图new_post.php

// new_post.php
<ul>
<?php foreach($data as $post):?>
<li>
    <?= $post->title;?>
</li>
<?php endforeach;?>
</ul>

融入行为

考虑到公司社区冷清的人气,我决定使用yii2这2.0.14中的CacheableWidgetBehavior行为对这个挂件进行缓存。

// @app/components/NewPost.php
...
use yii\behaviors\CacheableWidgetBehavior;
class NewPost extends Widget {
  ...
    public function behaviors(){
        return [
            [
                'class' => CacheableWidgetBehavior::className(),
                'cacheDuration' => 60,
            ]
        ];
    }  
  ...
}

这样设置后会对整个挂件进行缓存,我通过cacheDuration参数设置有效期为60秒,不写也是默认60秒,接下来是见证奇迹的时候。

alt

alt

既然是缓存,那我们来看看runtime/cache文件夹

alt

老板的回复

当我兴致高高的拿给老板看的时候,老板一份假正经的说:“小北呀,这样不好吧,我还是要有新帖这里就马上能看到,否则用户体验不好的,在想想办法?既能减少数据库压力还能保证第一时间!!”

哦,好在哥还有一招。

看代码

//@app/components/NewPost.php
public function behaviors(){
    return [
        [
            'class' => CacheableWidgetBehavior::className(),
            'cacheDuration' => 0,
            'cacheDependency' => [
                'class' => 'yii\caching\DbDependency',
                'sql' => 'SELECT MAX(updated_at) FROM post',
            ]
        ]
    ];
}

我设置了cacheDuration=0代表永远不过期,然后添加cacheDependency项,为行为增加一个数据库依赖,存储帖子最新的更新时间,这样当有新的帖子进来后,则updated_at变化导致缓存失效,然后从新查询新帖后重新建立。

测试成功,大喜。

一溜烟的跑到老板处并获得了准点下班的福利。

额外的

既然用了CacheableWidgetBehavior,还有必要说下cacheKeyVariations变量,一般配置如下

public function behaviors(){
    return [
        [
            'class' => CacheableWidgetBehavior::className(),
            'cacheDuration' => 0,
            'cacheKeyVariations' => 1
        ]
    ];
}

cacheKeyVariations可以是一个字符串或一个数组,当cacheKeyVariations的值发生变化后也会导致缓存重新建立。具体如何使用要看大家需求了。

以上就是关于CacheableWidgetBehavior的一些用法,希望这个2.0.14新增的内置行为为你的开发带来便利。

评论