作為PHP的開源框架,自然少不了對緩存的支持。Yii緩存可以在不同的級別使用。在最低級別,可用來緩存單個數(shù)據(jù)(數(shù)據(jù)緩存)。往上一級,我們緩存一個由視圖腳本生成的頁面片斷(片段緩存)。在最高級別,可存儲整個頁面以便需要的時候直接從緩存讀取。本文說明頁面緩存的配置及實(shí)現(xiàn)效果;
實(shí)現(xiàn)分為2步;
1. 在config文件加入緩存組件.
'cache' => array (
'class' => 'system.caching.CFileCache',
'directoryLevel' => 2,
),
class標(biāo)識需要使用的緩存媒介,用途比較廣的類型基本都有支持:
CMemCache: 使用 PHP memcache 擴(kuò)展.
CApcCache: 使用 PHP APC 擴(kuò)展.
CDbCache: 使用一張數(shù)據(jù)庫表來存儲緩存數(shù)據(jù)。
CFileCache: 使用文件來存儲緩存數(shù)據(jù)。 特別適用于大塊數(shù)據(jù)(例如頁面)。
當(dāng)然,yii也可以支持Redis,需要裝一個插件:
http://www.yiibase.com/download/view/32.html
本文實(shí)例使用的是文件緩存,對于文件緩存,緩存到的位置為protected/runtime/;directoryLevel設(shè)置緩存文件的目錄深度;如果緩存頁面特別多,這個值需要設(shè)置大點(diǎn),否則每個目錄下的頁面會很多;
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',表示只對以下方法進(jìn)行緩存:actionPost, actionList
duration 是緩存的時間,單位是秒,
varyByParam 是指定一系列GET參數(shù)名稱列表, 使用相應(yīng)的值去確定緩存內(nèi)容的版本,即同一個action用于區(qū)分是不同頁面的的參數(shù),此處我以id和page來區(qū)分不同頁面。
除varyByParam以外,還可以采用其他的條件來區(qū)分頁面:
varyByExpression:指定緩存內(nèi)容通過自定義的PHP表達(dá)式的結(jié)果而變化
varyByRoute:指定緩存內(nèi)容基于請求的路由不同而變化 (controller 和 action)
varyBySession:指定是否緩存內(nèi)容. 因用戶session不同而變化
dependency'指定緩存失效依賴關(guān)系:可指定文件或數(shù)據(jù)庫;本文采用的是數(shù)據(jù)庫依賴CDbCacheDependency;
本例指定的是數(shù)據(jù)庫,通過數(shù)據(jù)表的某個值的變化來確定緩存是否失效。例如,如果在表中新增了一條me115_book記錄,即使緩存才過了2分鐘(<3600),仍然判斷為失效,從而查詢數(shù)據(jù)庫,生成整個頁面,再次緩存;
檢查:
查看當(dāng)前頁面是否緩存,可以dump輸出一個當(dāng)前服務(wù)器時間,從而檢查當(dāng)前頁面是否已緩存;
優(yōu)化效果:
優(yōu)化站點(diǎn)為一個博客站點(diǎn)(me115.com),除了DNS解析轉(zhuǎn)接外,未進(jìn)行任何優(yōu)化,優(yōu)化前的數(shù)據(jù)為:
首字節(jié)時間為842ms;
采用頁面緩存之后的效果:
首字節(jié)時間為376ms;html生成的時間大大縮短,后臺時間減少了一倍。
當(dāng)然,通過本圖可以看到整個站點(diǎn)的用時還是比較長,主要是在頁面組件(css/js/圖片)上的下載耗費(fèi)了不少時間,后續(xù)將針對這方面進(jìn)行前端優(yōu)化;