yii2 页面缓存 / 片段缓存 / 依赖缓存
yii2 2017-11-22 09:15:29

页面缓存指的是在服务器端缓存整个页面的内容。 随后当同一个页面被请求时,内容将从缓存中取出,而不是重新生成。

页面缓存由 yii\filters\PageCache 类提供支持,该类是一个过滤器。 它可以像这样在控制器类中使用: 

PHP Code复制内容到剪贴板
  1. public function behaviors()  
  2. {  
  3.     return [  
  4.         [  
  5.             'class' => 'yii\filters\PageCache',  
  6.             'only' => ['index'],  
  7.             'duration' => 60,  
  8.             'variations' => [  
  9.                 \Yii::$app->language,  
  10.             ],  
  11.             'dependency' => [  
  12.                 'class' => 'yii\caching\DbDependency',  
  13.                 'sql' => 'SELECT COUNT(*) FROM post',  
  14.             ],  
  15.         ],  
  16.     ];  
  17. }  

上述代码表示页面缓存只在 index 操作时启用,页面内容最多被缓存 60 秒, 会随着当前应用的语言更改而变化。 dependency 表示如果文章总数发生变化则缓存的页面会失效。

如你所见,页面缓存和片段缓存极其相似。 它们都支持 durationdependenciesvariations 和 enabled 配置选项。 它们的主要区别是页面缓存是由过滤器实现,而片段缓存则是一个小部件

 

你可以在使用页面缓存的同时, 使用片段缓存动态内容

 

数据缓存:

PHP Code复制内容到剪贴板
  1. // 依赖缓存,只要总数没变,缓存一直生效  
  2.   
  3.  $duration = 120;     // 缓存查询结果 120 秒。  
  4.  $dependency = $dependency = new \yii\caching\DbDependency(['sql'=> 'SELECT count(*) FROM ' . Hjjc::tableName()]); // 可选的依赖关系  
  5.   
  6.  $result = \Yii::$app->db->cache(function ($dbuse ($limit) {  
  7.      $sbIds = Hjjc::find()->select("sb_id,title")->asArray()->all();  
  8.      $res = [];  
  9.      foreach ($sbIds as $k => $v){  
  10.          $data = HjjcData::find()->select("C10,sb_id,ydata,created_at")->where(['sb_id'=>$v['sb_id']])->orderBy("created_at desc")->limit($limit)->all();  
  11.          $ret = [];  
  12.          if($data){  
  13.              $ret = HjjcData::HandleData($data[0]->ydata); // 只需要取最后一条即可  
  14.              $allData = [];  
  15.              foreach ($data as $k1 => $v1){  
  16.                  $v1 = HjjcData::HandleData($v1->ydata); // 每条数据都处理一下  
  17.                  $allData[] = [  
  18.                      "date" => $v1['LastActive'],  
  19.                      "pm25" => $v1['ItemsData']['C10']['value']  
  20.                  ];  
  21.              }  
  22.              ArrayHelper::multisort($allData'date', SORT_ASC);  
  23.              $ret['allData'] = $allData// ArrayHelper::getColumn($data, 'C10');  
  24.          }  
  25.          $ret['DeviceName'] = $v['title'];  
  26.          $res[] = $ret;  
  27.      }  
  28.   
  29.      return $res;  
  30.  }, $duration$dependency);  
  31.   
  32.   
  33.  return [  
  34.      "data" => $result  
  35.  ];  

 

PHP Code复制内容到剪贴板
  1. $duration = 1 * 24 * 60 * 60;     // 缓存查询结果 1天。  
  2.   
  3. $duration = 20 * 60;     // 缓存查询结果 20 分钟。  

 

它依赖于 update_at 字段是否被更改过的:

PHP Code复制内容到剪贴板
  1. $dependency = [  
  2.     'class' => 'yii\caching\DbDependency',  
  3.     'sql' => 'SELECT MAX(updated_at) FROM post',  
  4. ];  
  5.   
  6. if ($this->beginCache($id, ['dependency' => $dependency])) {  
  7.   
  8.     // ... 在此生成内容 ...  
  9.   
  10.     $this->endCache();  
  11. }  

 

数据缓存www.yiichina.com/doc/guide/2.0/caching-data

从 2.0.11 版本开始, 缓存组件 提供了 getOrSet() 方法来简化数据的取回、计算和存储。 下面的代码逻辑和上一个例子是完全一样的:

PHP Code复制内容到剪贴板
  1. $key = "siteProblemAnalysisAPI";  
  2. $duration = null;  
  3. $dependency = new DbDependency([  
  4.     'sql'=>'SELECT MAX(updated_at) FROM '.Inspection::tableName()  
  5. ]);  
  6. $cache = Yii::$app->cache;  
  7. $data = $cache->getOrSet($keyfunction () {  
  8.       
  9.     return ["test"=>345];  
  10. },$duration,$dependency);  
  11.   
  12. return $data;  

 

 

 

 

 


 

依赖缓存:

删除后 、 写入后 、 更新后,使指定的tag,或者 key 缓存失效

 

PHP Code复制内容到剪贴板
  1. public static $listCacheKey = "projectCommonSettingClassListCache";  
  2.   
  3. public static $listCacheTag = "projectCommonSettingClassListCacheTag";  
  4.   
  5.   
  6. public function behaviors()  
  7. {  
  8.     return [  
  9.         [  
  10.             'class' => CacheInvalidateBehavior::className(),  
  11.             'tags' => [  
  12.                 self::$listCacheTag  
  13.             ]  
  14.         ],  
  15.         ...  
  16.     ];  
  17. }  
  18.   
  19. /** 
  20.  * 获取分类列表 
  21.  * @param null $module 
  22.  * @return array|mixed|\yii\db\ActiveRecord[] 
  23.  */  
  24. public static function lists()  
  25. {  
  26.     $list = Yii::$app->cache->get(self::$listCacheKey);  
  27.     if ($list === false) {  
  28.         $query = static::find();  
  29.         $list = $query->indexBy("class_id")->asArray()->all();  
  30.         $list = array_map(function ($item){  
  31.             $item['sons'] = self::find()->where(["parent_class_id" => $item["class_id"]])->asArray()->all();  
  32.             return $item;  
  33.         }, $list);  
  34.         Yii::$app->cache->set(self::$listCacheKey$list, 0, new TagDependency(['tags' => [self::$listCacheTag]]));  
  35.     }  
  36.     return $list;  
  37. }  

 

 

 

 

 

本文来自于:http://www.yoyo88.cn/study/yii2/221.html

Powered by yoyo苏ICP备15045725号