作為PHP的開源架構,自然少不了對緩衝的支援。Yii緩衝可以在不同的層級使用。在最低層級,可用來緩衝單個資料(資料緩衝)。往上一級,我們緩衝一個由視圖指令碼產生的頁面片斷(片段快取)。在最進階別,可儲存整個頁面以便需要的時候直接從緩衝讀取。本文說明頁面緩衝的配置及實現效果;
實現分為2步;
1. 在config檔案加入緩衝組件.
'cache' => array (
'class' => 'system.caching.CFileCache',
'directoryLevel' => 2,
),
class標識需要使用的緩衝媒介,用途比較廣的類型基本都有支援:
CMemCache: 使用 PHP memcache 擴充.
CApcCache: 使用 PHP APC 擴充.
CDbCache: 使用一張資料庫表來儲存快取資料。
CFileCache: 使用檔案來儲存快取資料。 特別適用於大塊資料(例如頁面)。
當然,yii也可以支援Redis,需要裝一個外掛程式:
http://www.yiibase.com/download/view/32.html
本文執行個體使用的是檔案快取,對於檔案快取,緩衝到的位置為protected/runtime/;directoryLevel設定快取檔案的目錄深度;如果快取頁面面特別多,這個值需要設定大點,否則每個目錄下的頁面會很多;
2. 在要做緩衝的控制器裡定義過濾器。
public function filters() {
return array (
array (
'COutputCache + post, list',
'duration' => 3600,
'varyByParam' => array('id','page'),
'dependency' => array(
'class'=>'CDbCacheDependency',
'sql'=>'SELECT MAX(id) FROM me115_book',
)
);
}
COutputCache 是用於處理緩衝的類,如果只填'COutputCache',則控制器裡所有action都會通過緩衝過濾,定義'COutputCache + post, list',表示只對以下方法進行緩衝:actionPost, actionList
duration 是緩衝的時間,單位是秒,
varyByParam 是指定一系列GET參數名稱列表, 使用相應的值去確定緩衝內容的版本,即同一個action用於區分是不同頁面的的參數,此處我以id和page來區分不同頁面。
除varyByParam以外,還可以採用其他的條件來區分頁面:
varyByExpression:指定緩衝內容通過自訂的PHP運算式的結果而變化
varyByRoute:指定緩衝內容基於請求的路由不同而變化 (controller 和 action)
varyBySession:指定是否緩衝內容. 因使用者session不同而變化
dependency'指定緩衝失效依賴關係:可指定檔案或資料庫;本文採用的是資料庫依賴CDbCacheDependency;
本例指定的是資料庫,通過資料表的某個值的變化來確定緩衝是否失效。例如,如果在表中新增了一條me115_book記錄,即使緩衝才過了2分鐘(<3600),仍然判斷為失效,從而查詢資料庫,產生整個頁面,再次緩衝;
檢查:
查看當前頁面是否緩衝,可以dump輸出一個當前伺服器時間,從而檢查當前頁面是否已緩衝;
最佳化效果:
最佳化網站為一個部落格網站(me115.com),除了DNS解析轉接外,未進行任何最佳化,最佳化前的資料為:
首位元組時間為842ms;
採用頁面緩衝之後的效果:
首位元組時間為376ms;html產生的時間大大縮短,後台時間減少了一倍。
當然,通過本圖可以看到整個網站的用時還是比較長,主要是在頁面組件(css/js/圖片)上的下載耗費了不少時間,後續將針對這方面進行前端最佳化;
Posted by: 大CC | DEC17,2012
部落格:cnblogs.com/me115/ [訂閱]
微博:新浪微博
進一步參考:
[1] http://www.yiiframework.com/doc/api/1.1/COutputCache#dependency-detail
[2] http://www.yiiframework.com/forum/index.php?/topic/3592-%E5%85%B3%E4%BA%8E%E9%A1%B5%E9%9D%A2%E7%BC%93%E5%AD%98%E7%9A%84%E7%96%91%E9%97%AE/page__p__19429
[3] http://www.yiibase.com/download/view/32.html