[TOC] 如何使用yii2的緩存依賴特性 概述 緩存是Yii2的強大特性之一,合理使用緩存技術可以有效地減小伺服器的訪問壓力。Yii2最基本的緩存包括 數據緩存 、 片段緩存 、 頁面緩存 和 HTTP緩存 ,這部分內容在官方文檔中有更加詳細的說明,這裡不再贅述,如有需要可以參考Yii2官方開發文 ...
目錄
如何使用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中,聲明依賴關係:
<?php
namespace frontend\controllers;
use yii\web\Controller;
class IndexController extends Controller
{
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',
],
],
];
}
public function actionIndex()
{
return $this->render('index');
}
}
如代碼所示,在行為方法behaviors()
中聲明頁面配置的驅動類,only
對應為一個數組,數組元素是需要緩存的方法對應的視圖。duration表示過期時間,單位為秒。variations對應一個數組,系統會監聽這個數組中內容是否發生了變化,如果發生變化就會刷新緩存,反之則不會。dependency對應依賴關係,其中class表示緩存依賴的類,sql表示一個一條查詢語句。含義就是post數據表中記錄的總條數發生變化時,就可以認為新增或者刪除類某條數據,需要刷新緩存。
鏈式依賴
上面的例子非常簡單,而實際開發往往要更加複雜。有時候一個頁面是否需要刷新由很多因素決定,不是一個關係就可以描述清楚的。比如說post數據表中既沒有刪除沒有增加,而是更新一條數據,那上面那查詢語句就無法處理類。這時候,可以用SELECT MAX(*) FROM post
檢測更新,但內置頁面緩存類中無法直接寫入這兩個查詢,這時候可以用鏈式依賴的內置類來解決這個問題。
所謂鏈式依賴,就是將緩存依賴關係配置到一個鏈中,一旦鏈中某個關係不成立,就會刷新緩存。
其中yii\caching\ChainedDependency
就是緩存依賴的主要實現類。實現代碼如下所示:
<?php
namespace frontend\controllers;
use yii\web\Controller;
class IndexController extends Controller
{
public function behaviors()
{
return [
'pageCache' => [
'class' => 'yii\filters\PageCache',
'only' => ['index'],
'duration' => 24 * 3600 * 365, // 1 year
'variations' => [
\Yii::$app->language,
\Yii::$app->id
],
'dependency' => [
'class' => 'yii\caching\ChainedDependency',
'dependencies' => [
new \yii\caching\DbDependency(['sql' => 'SELECT MAX(updated_at) FROM post']),
new \yii\caching\DbDependency(['sql' => 'SELECT COUNT(id) FROM post']),
new \yii\caching\DbDependency(['sql' => 'SELECT MAX(updated_at) FROM category']),
new \yii\caching\DbDependency(['sql' => 'SELECT COUNT(id) FROM category']),
new \yii\caching\ExpressionDependency(['expression'=>'\Yii::$app->request->get("id")']);
new \yii\caching\FileDependency(['fileName'=>'yanying.txt']);
]
],
],
];
}
public function actionIndex()
{
return $this->render('index');
}
}
如上所示,dependency中配置類Yii2內置的鏈式依賴,併在dependencies中定義類緩存依賴關係的“鏈”。當鏈上某個關係不成立時,就會刷新緩存。另外在整個緩存頁面中,如果某一小部分並不需要緩存,可以將其設置為動態內容,這部分可以查看官方文檔,不過更推薦看源碼,文檔介紹的比較簡單。
總結
Yii2沒有提供HTML頁面靜態化的內置功能,而是提供了緩存機制。在開髮網站的時候可以通過偽靜態+緩存的方式優化內容頁面,並且採用內置的緩存依賴和鏈式依賴解決內容過期的問題,通過動態內容的設置處理不需要緩存的部分,比如登錄後,首頁可以會顯示用戶名,這部分就可以用動態內容。