全面剖析Smarty緩存機制

今天主要全面總結下Smarty模板引擎中強大的緩存機制,緩存機制有效減少了系統對服務器的壓力,而這也是很多開發者喜歡Smarty的原因之一,由於篇幅較大,便於博友閱讀,這篇文章將剖析Smarty緩存的幾種方式,下篇文章着重講解下設置緩存及清除緩存的技巧方法(其中包含緩存集合方法)。

一、Smarty緩存的幾種方式
緩存機制中,分爲全局緩存、部分緩存、局部緩存三種方式,後面會一一講述,下面是緩存設置前,Smarty類方法基本目錄設置如下:
$smarty->Smarty();
$smarty->template_dir = $ROOT."/templates";//模板目錄
$smarty->compile_dir = $ROOT."/templates_c";//編譯目錄
$smarty->cache_dir = $ROOT."/cache";//緩存目錄
$smarty->caching = true;//是否開啓緩存,值爲0,1,2,0則不開啓:1則開啓緩存:2則可設置特殊緩存,即在加載模板頁前,對局部進行緩存時間的特殊設定,後面會講到;可不寫,默認爲true-開啓 
$smarty->cache_lifetime = "3600";//緩存時間 ,可不寫,默認爲3600

$smarty->compile_check = true;//是否進行編譯,可不寫,默認爲true

緩存機制中調用模板生成緩存頁面,用的一個display()方法,將會在後文中用到,這裏先講解一下:
$smarty->display(string template[, string cache_id[, string compile_id]]);
第一個必須參數:template,爲需顯示的模板;
第二個可選參數:cache_id,可指定一個緩存號,此參數是給頁面緩存添加一個標識的作用;
第三個可選參數:compile_id,可指定一個編譯號 ,此參數是把一個模板編譯成不同版本時使用,同樣是起一個標識的作用,不常用。

上面代碼簡潔、說明易懂吧!若引用創建Smarty類都不知,那下面可以省了,呵,開個玩笑!接着往下看。

1、全局緩存方式
定義:字面上看,意思很明瞭,就是爲整個網站的全部頁面都進行緩存生成,只要頁面調用了Smarty類模板。
代碼實例:其實,在這段之前的基本目錄設置中就講到了,爲說明,用藍顏色標明瞭出來代碼,只要在類中這樣設置,並在頁面中進行如下引用,頁面即進行了緩存,
$smarty->display(‘index.tpl’);
而這條語句,有一個很大的缺陷,就是一個模板即一個模板頁面,只生成一個緩存,而我們知道,大多網站的多數頁面後面會接一些參數或不同頁面調用同一個模板,比如:
http://blog.unvs.cn/archives/2012_9.html
http://blog.unvs.cn/archives/2012_8.html
http://blog.unvs.cn/archives/2012_7.html
比方這些是調用的同一個模板生成的頁面,但是又必須生成3個緩存,使用上面的語句肯定做不到,這裏我們要想到一開始講到的第二個可選參數cache_id,用一個緩存號,來區分同一個模板生成不同的頁面及緩存,代碼實例:
$cache_id = $_GET['id'];//url中的id參數值
$smarty->display(‘index.tpl’, $cache_id);//將緩存號加入,即可完成–同一模板–不同參數–不同緩存 的功能;
到這裏,有人發現,如果我的頁面不止一個參數,那是不是得全部解析出來並做爲緩存號?這裏有一個更好的方法,推薦給大家,也是網上大多贊同的。(其實,上面一段是’廢話‘,可去掉,但爲了循序漸進,更好理解而寫的過渡,諒)
推薦的方法是:你可以直接將整個當前URL獲取下來,作爲cache_id加入緩存,這樣無論它多少個參數,都不會存在同一個緩存頁,
代碼實例:
$url=$_SERVER['REQUEST_URI'];//獲取當前頁URL,有的將url進行md5加密,亦可
$smarty->display(‘index.tpl’, $url);

2、部分緩存方式
定義:意思就是,網站系統的部分頁面進行緩存,而一些頁面不進行緩存,比方網站的註冊、登錄處理頁面可不進行緩存。
一種處理方式:在display()方法前或後面,將此模板緩存進行一次清除操作,注意保持兩者參數必須一致;
代碼實例:
$smarty->clear_cache(“index.tpl”);//此句放在display方法句前後都可以
$smarty->display(“index.tpl”);//與clear_cache方法參數必須一致
另一種處理方式:原理是一樣的,因爲部分緩存相當於兩種情況,你可以另寫一個display方法進行重構,其中一個參數判斷是否進行緩存,若不,則進行clear_cache()方法處理,否則進行緩存;
代碼實例:
function display($temp_name, $cache_id = null,$is_cache = true){
if($is_cache){
$smarty->clear_cache(“index.tpl”, $cache_id);
$smarty->display(“index.tpl”, $cache_id);//此兩句不解,見上面綠色代碼
}else{
$smarty->display(“index.tpl”, $cache_id);  
}}
調用方法:self::display($temp_name, $cache_id, false);//這樣設置即不進行緩存,有任何疑問可留言提出。

3、局部緩存方式
定義:一個頁面,一些地方不進行緩存,保持動態更新,每次都加載,比如文章詳細頁的瀏覽次數、登錄窗口框等。
有幾種可實現局部緩存的方法(反面即處理好不緩存的地方就可實現局部緩存),着重講解1、2種方法,我覺得就可以了,不用學會那麼多。
a、使用SMarty引擎中內置的nocache函數,實現不緩存功能(smarty3.1.8版支持,不知smarty2+是否支持)
直接在tpl或html模板頁中,不緩存區域加入{nocache}不緩存內容{/nocache}即可。
代碼實例:
處理頁面:$smarty->assign("time",time());
模板頁面:{nocache}<{$time}>{/nocache}
b、註冊塊方法,實現不緩存
寫一個no_cached方法,並調用smarty註冊塊函數將方法進行註冊,即可實現,直接貼實例。
代碼實例:
處理頁面:$smarty->assign("time",time());
function no_cached($param, $content){//參數$param爲塊參數數組,參數$content爲不緩存內容
return $content;
}
$smarty->register_block("no_cached", “no_cached”, false);//註冊塊方法:register_block($tpl_func, $reg_func, $cacheable);//參數1爲模板函數;參數2爲需註冊的函數即上面寫的函數;參數3爲是否進行緩存,這裏必須設置爲false
模板頁面:{no_cached}<{$time}>{/no_cached}
c、當然還有其他一些方法,比如:註冊函數等,這裏就不介紹了,其中註冊塊詳細使用,請查看smarty說明書,這裏就不詳述了。

4、緩存機制中的is_cached用法
最後,說下is_cached($temp_tpl[, $cache_id])判斷是否已被緩存這個方法,$temp_tpl參數爲模板頁,$cache_id參數爲緩存號,這個方法主要用在加載模板前進行緩存判斷,若不存在就加載數據,若存在直接跳過,這樣就達到了緩存的最終目的。
示例:
if(!smarty->is_cached(‘index.tpl’)){//不存在緩存
//調用數據庫,並對變量進行賦值
}
$smarty->display(‘index.tpl’);//加載模板頁

到這裏,Smarty中緩存機制的幾種方式就全部詳細講解完了,其中每部分都分別以代碼實例展示。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章