當前位置:首頁 > PHP教程 > php應用 > 列表

如何使用yii2的緩存依賴特性(代碼示例)

發布:smiling 來源: PHP粉絲網  添加日期:2020-01-10 17:33:29 瀏覽: 評論:0 

本篇文章給大家帶來的內容是關于如何使用yii2的緩存依賴特性(代碼示例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

緩存是Yii2的強大特性之一,合理使用緩存技術可以有效地減小服務器的訪問壓力。Yii2最基本的緩存包括數據緩存、片段緩存、頁面緩存和HTTP緩存,這部分內容在官方文檔中有更加詳細的說明,這里不再贅述,如有需要可以參考Yii2官方開發文檔中的緩存部分。

頁面緩存:

數據緩存與片段緩存都是針對網站中某一部分內容進行的緩存,這種緩存需要在代碼部分進行顯示聲明,修改起來比較麻煩。相對的頁面緩存則是針對控制器下方法,對這個方法的視圖文件進行頁面級別的緩存。由于頁面緩存可以使用行為的形式,對控制器進行注入,修改的時候只要在控制器中修改對應的配置項即可,所以使用頁面緩存更加簡單,擴展性更強。

緩存依賴:

一般來說,緩存可以增強服務器的性能,但會一定程度上減弱其交互性。所以需要對緩存進行定期的檢查,清理過期數據,填充最新數據,以保證內容的及時準確。在這一點上,Yii2的緩存依賴可以有效解決這個問題。Yii2共有五個內置的緩存類,如下所示:

yii\caching\ChainedDependency:如果依賴鏈上任何一個依賴產生變化,則依賴改變。

yii\caching\DbDependency:如果指定 SQL 語句的查詢結果發生了變化,則依賴改變。

yii\caching\ExpressionDependency:如果指定的 PHP 表達式執行結果發生變化,則依賴改變。

yii\caching\FileDependency:如果文件的最后修改時間發生變化,則依賴改變。

yii\caching\TagDependency:將緩存的數據項與一個或多個標簽相關聯。 您可以通過調用 yii\caching\TagDependency::invalidate() 來檢查指定標簽的緩存數據項是否有效。

以數據庫依賴DbDependency為例,在控制器IndexController中,聲明依賴關系:

  1. <?php 
  2.  
  3. namespace frontend\controllers; 
  4.  
  5. use yii\web\Controller; 
  6.  
  7. class IndexController extends Controller 
  8.  
  9.  
  10.     public function behaviors() 
  11.  
  12.     { 
  13.  
  14.         return [ 
  15.  
  16.             [ 
  17.  
  18.                 'class' => 'yii\filters\PageCache'
  19.  
  20.                 'only' => ['index'], 
  21.  
  22.                 'duration' => 60, 
  23.  
  24.                 'variations' => [ 
  25.  
  26.                     \Yii::$app->language, 
  27.  
  28.                 ], 
  29.  
  30.                 'dependency' => [ 
  31.  
  32.                     'class' => 'yii\caching\DbDependency'
  33.  
  34.                     'sql' => 'SELECT COUNT(*) FROM post'
  35.  
  36.                 ], 
  37.  
  38.             ], 
  39.  
  40.         ]; 
  41.  
  42.     } 
  43.  
  44.  
  45. //phpfensi.com 
  46.     public function actionIndex() 
  47.  
  48.     { 
  49.  
  50.         return $this->render('index'); 
  51.  
  52.     } 
  53.  
  54.       
  55.  

如代碼所示,在行為方法behaviors()中聲明頁面配置的驅動類,only對應為一個數組,數組元素是需要緩存的方法對應的視圖。duration表示過期時間,單位為秒。variations對應一個數組,系統會監聽這個數組中內容是否發生了變化,如果發生變化就會刷新緩存,反之則不會。dependency對應依賴關系,其中class表示緩存依賴的類,sql表示一個一條查詢語句。含義就是post數據表中記錄的總條數發生變化時,就可以認為新增或者刪除類某條數據,需要刷新緩存。

鏈式依賴

上面的例子非常簡單,而實際開發往往要更加復雜。有時候一個頁面是否需要刷新由很多因素決定,不是一個關系就可以描述清楚的。比如說post數據表中既沒有刪除沒有增加,而是更新一條數據,那上面那查詢語句就無法處理類。這時候,可以用SELECT MAX(*) FROM post檢測更新,但內置頁面緩存類中無法直接寫入這兩個查詢,這時候可以用鏈式依賴的內置類來解決這個問題。

所謂鏈式依賴,就是將緩存依賴關系配置到一個鏈中,一旦鏈中某個關系不成立,就會刷新緩存。

其中yii\caching\ChainedDependency就是緩存依賴的主要實現類。實現代碼如下所示:

  1. <?php 
  2.  
  3. namespace frontend\controllers; 
  4.  
  5. use yii\web\Controller; 
  6.  
  7. class IndexController extends Controller 
  8.  
  9.  
  10.     public function behaviors() 
  11.  
  12.     { 
  13.  
  14.         return [ 
  15.  
  16.             'pageCache' => [ 
  17.  
  18.                 'class' => 'yii\filters\PageCache'
  19.  
  20.                 'only' => ['index'], 
  21.  
  22.                 'duration' => 24 * 3600 * 365, // 1 year 
  23.  
  24.                 'variations' => [ 
  25.  
  26.                     \Yii::$app->language, 
  27.  
  28.                     \Yii::$app->id 
  29.  
  30.                 ], 
  31.  
  32.                 'dependency' => [ 
  33.  
  34.                     'class' => 'yii\caching\ChainedDependency'
  35.  
  36.                     'dependencies' => [ 
  37.  
  38.                         new \yii\caching\DbDependency(['sql' => 'SELECT MAX(updated_at) FROM post']), 
  39.  
  40.                         new \yii\caching\DbDependency(['sql' => 'SELECT COUNT(id) FROM post']), 
  41.  
  42.                         new \yii\caching\DbDependency(['sql' => 'SELECT MAX(updated_at) FROM category']), 
  43.  
  44.                         new \yii\caching\DbDependency(['sql' => 'SELECT COUNT(id) FROM category']), 
  45.  
  46.                         new \yii\caching\ExpressionDependency(['expression'=>'\Yii::$app->request->get("id")']); 
  47.  
  48.                         new \yii\caching\FileDependency(['fileName'=>'yanying.txt']); 
  49.  
  50.                     ] 
  51.  
  52.                 ], 
  53.  
  54.             ], 
  55.  
  56.         ]; 
  57.  
  58.     } 
  59.  
  60.  
  61. //phpfensi.com 
  62.     public function actionIndex() 
  63.  
  64.     { 
  65.  
  66.         return $this->render('index'); 
  67.  
  68.     } 
  69.  
  70.       
  71.  

如上所示,dependency中配置類Yii2內置的鏈式依賴,并在dependencies中定義類緩存依賴關系的“鏈”。當鏈上某個關系不成立時,就會刷新緩存。另外在整個緩存頁面中,如果某一小部分并不需要緩存,可以將其設置為動態內容,這部分可以查看官方文檔,不過更推薦看源碼,文檔介紹的比較簡單。

總結:

Yii2沒有提供HTML頁面靜態化的內置功能,而是提供了緩存機制。在開發網站的時候可以通過偽靜態+緩存的方式優化內容頁面,并且采用內置的緩存依賴和鏈式依賴解決內容過期的問題,通過動態內容的設置處理不需要緩存的部分,比如登錄后,首頁可以會顯示用戶名,這部分就可以用動態內容。

Tags: yii2緩存依賴特性

分享到:

六合图库图纸印刷网