yii2 页面缓存 / 片段缓存 / 依赖缓存
页面缓存指的是在服务器端缓存整个页面的内容。 随后当同一个页面被请求时,内容将从缓存中取出,而不是重新生成。
页面缓存由 yii\filters\PageCache 类提供支持,该类是一个过滤器。 它可以像这样在控制器类中使用:
PHP Code复制内容到剪贴板
- public function behaviors()
- {
- return [
- [
- 'class' => 'yii\filters\PageCache',
- 'only' => ['index'],
- 'duration' => 60,
- 'variations' => [
- \Yii::$app->language,
- ],
- 'dependency' => [
- 'class' => 'yii\caching\DbDependency',
- 'sql' => 'SELECT COUNT(*) FROM post',
- ],
- ],
- ];
- }
上述代码表示页面缓存只在 index
操作时启用,页面内容最多被缓存 60 秒, 会随着当前应用的语言更改而变化。 dependency 表示如果文章总数发生变化则缓存的页面会失效。
如你所见,页面缓存和片段缓存极其相似。 它们都支持 duration
,dependencies
,variations
和 enabled
配置选项。 它们的主要区别是页面缓存是由过滤器实现,而片段缓存则是一个小部件。
数据缓存:
PHP Code复制内容到剪贴板
- // 依赖缓存,只要总数没变,缓存一直生效
- $duration = 120; // 缓存查询结果 120 秒。
- $dependency = $dependency = new \yii\caching\DbDependency(['sql'=> 'SELECT count(*) FROM ' . Hjjc::tableName()]); // 可选的依赖关系
- $result = \Yii::$app->db->cache(function ($db) use ($limit) {
- $sbIds = Hjjc::find()->select("sb_id,title")->asArray()->all();
- $res = [];
- foreach ($sbIds as $k => $v){
- $data = HjjcData::find()->select("C10,sb_id,ydata,created_at")->where(['sb_id'=>$v['sb_id']])->orderBy("created_at desc")->limit($limit)->all();
- $ret = [];
- if($data){
- $ret = HjjcData::HandleData($data[0]->ydata); // 只需要取最后一条即可
- $allData = [];
- foreach ($data as $k1 => $v1){
- $v1 = HjjcData::HandleData($v1->ydata); // 每条数据都处理一下
- $allData[] = [
- "date" => $v1['LastActive'],
- "pm25" => $v1['ItemsData']['C10']['value']
- ];
- }
- ArrayHelper::multisort($allData, 'date', SORT_ASC);
- $ret['allData'] = $allData; // ArrayHelper::getColumn($data, 'C10');
- }
- $ret['DeviceName'] = $v['title'];
- $res[] = $ret;
- }
- return $res;
- }, $duration, $dependency);
- return [
- "data" => $result
- ];
PHP Code复制内容到剪贴板
- $duration = 1 * 24 * 60 * 60; // 缓存查询结果 1天。
- $duration = 20 * 60; // 缓存查询结果 20 分钟。
它依赖于 update_at 字段是否被更改过的:
PHP Code复制内容到剪贴板
- $dependency = [
- 'class' => 'yii\caching\DbDependency',
- 'sql' => 'SELECT MAX(updated_at) FROM post',
- ];
- if ($this->beginCache($id, ['dependency' => $dependency])) {
- // ... 在此生成内容 ...
- $this->endCache();
- }
数据缓存:www.yiichina.com/doc/guide/2.0/caching-data
从 2.0.11 版本开始, 缓存组件 提供了 getOrSet() 方法来简化数据的取回、计算和存储。 下面的代码逻辑和上一个例子是完全一样的:
PHP Code复制内容到剪贴板
- $key = "siteProblemAnalysisAPI";
- $duration = null;
- $dependency = new DbDependency([
- 'sql'=>'SELECT MAX(updated_at) FROM '.Inspection::tableName()
- ]);
- $cache = Yii::$app->cache;
- $data = $cache->getOrSet($key, function () {
- return ["test"=>345];
- },$duration,$dependency);
- return $data;
依赖缓存:
删除后 、 写入后 、 更新后,使指定的tag,或者 key 缓存失效
PHP Code复制内容到剪贴板
- public static $listCacheKey = "projectCommonSettingClassListCache";
- public static $listCacheTag = "projectCommonSettingClassListCacheTag";
- public function behaviors()
- {
- return [
- [
- 'class' => CacheInvalidateBehavior::className(),
- 'tags' => [
- self::$listCacheTag
- ]
- ],
- ...
- ];
- }
- /**
- * 获取分类列表
- * @param null $module
- * @return array|mixed|\yii\db\ActiveRecord[]
- */
- public static function lists()
- {
- $list = Yii::$app->cache->get(self::$listCacheKey);
- if ($list === false) {
- $query = static::find();
- $list = $query->indexBy("class_id")->asArray()->all();
- $list = array_map(function ($item){
- $item['sons'] = self::find()->where(["parent_class_id" => $item["class_id"]])->asArray()->all();
- return $item;
- }, $list);
- Yii::$app->cache->set(self::$listCacheKey, $list, 0, new TagDependency(['tags' => [self::$listCacheTag]]));
- }
- return $list;
- }