本文實例講述了Smarty緩存機制。分享給大家供大家參考,具體如下:
Smarty模板引擎中強大的緩存機制,緩存機制有效減少了系統對服務器的壓力,而這也是很多開發者喜歡Smarty的原因之一,附錄中講解了設置緩存及清除緩存的技巧方法(其中包含緩存集合方法)。
一、Smarty緩存的幾種方式
緩存機制中,分為全局緩存、部分緩存、局部緩存三種方式,后面會一一講述,下面是緩存設置前,Smarty類方法基本目錄設置如下:
1
2
3
4
5
6
7
|
$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()方法,將會在后文中用到,這里先講解一下:
1
|
$smarty ->display(string template[, string cache_id[, string compile_id]]); |
第一個必須參數:template,為需顯示的模板;
第二個可選參數:cache_id,可指定一個緩存號,此參數是給頁面緩存添加一個標識的作用;
第三個可選參數:compile_id,可指定一個編譯號 ,此參數是把一個模板編譯成不同版本時使用,同樣是起一個標識的作用,不常用。
上面代碼簡潔、說明易懂吧!若引用創建Smarty類都不知,那下面可以省了,呵,開個玩笑!接著往下看。
1、全局緩存方式
定義:字面上看,意思很明了,就是為整個網站的全部頁面都進行緩存生成,只要頁面調用了Smarty類模板。
代碼實例:其實,在這段之前的基本目錄設置中就講到了,為說明,用藍顏色標明了出來代碼,只要在類中這樣設置,并在頁面中進行如下引用,頁面即進行了緩存,
1
|
$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,用一個緩存號,來區分同一個模板生成不同的頁面及緩存,代碼實例:
1
2
|
$cache_id = $_GET [ 'id' ]; //url中的id參數值 $smarty ->display( 'index.tpl' , $cache_id ); //將緩存號加入,即可完成–同一模板–不同參數–不同緩存 的功能; |
到這里,有人發現,如果我的頁面不止一個參數,那是不是得全部解析出來并做為緩存號?這里有一個更好的方法,推薦給大家,也是網上大多贊同的。(其實,上面一段是'廢話',可去掉,但為了循序漸進,更好理解而寫的過渡,諒)
推薦的方法是:你可以直接將整個當前URL獲取下來,作為cache_id加入緩存,這樣無論它多少個參數,都不會存在同一個緩存頁,
代碼實例:
1
2
|
$url = $_SERVER [ 'REQUEST_URI' ]; //獲取當前頁URL,有的將url進行md5加密,亦可 $smarty ->display( 'index.tpl' , $url ); |
2、部分緩存方式
定義:意思就是,網站系統的部分頁面進行緩存,而一些頁面不進行緩存,比方網站的注冊、登錄處理頁面可不進行緩存。
一種處理方式:在display()方法前或后面,將此模板緩存進行一次清除操作,注意保持兩者參數必須一致;
代碼實例:
1
2
|
$smarty ->clear_cache( "index.tpl" ); //此句放在display方法句前后都可以 $smarty ->display( "index.tpl" ); //與clear_cache方法參數必須一致 |
另一種處理方式:原理是一樣的,因為部分緩存相當于兩種情況,你可以另寫一個display方法進行重構,其中一個參數判斷是否進行緩存,若不,則進行clear_cache()方法處理,否則進行緩存;
代碼實例:
1
2
3
4
5
6
7
|
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 ); }} |
調用方法:
1
2
|
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());
1
2
3
4
|
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參數為緩存號,這個方法主要用在加載模板前進行緩存判斷,若不存在就加載數據,若存在直接跳過,這樣就達到了緩存的最終目的。
示例:
1
2
3
4
|
if (!smarty->is_cached( 'index.tpl' )){ //不存在緩存 //調用數據庫,并對變量進行賦值 } $smarty ->display( 'index.tpl' ); //加載模板頁 |
以上為Smarty的三種緩存
附:Smarty清除緩存方法
一、普通清除緩存方法
通過如下方法,對Smarty的緩存進行清除:
代碼示例:
1
2
3
|
$smarty ->clear_cache( "index.tpl" ); //清除一個模板的緩存; $smarty ->clear_cache( "index.tpl" , $cache_Id ); //清除一個帶緩存編號的緩存;如:頁面http://www.abc.com/index.asp?act=login,可以將$cache_id設為login; $smarty ->clear_all_cache(); //清除所有緩存,即緩存目錄下所有緩存文件; |
這樣就存在一個問題,比方網站有一個欄目:http://blog.unvs.cn/archives/php/,我只想清除這一個欄目的頁面緩存而不想全部清除或一個頁面緩存,這種情況經常會碰到,那么,接下來會講到Smarty引擎中強大的緩存集合方法。
二、清除緩存集合方法
Smarty中文教程是這樣描述的:可以通過建立cache_id集合做更詳細的集合體,在cache_id集合里用豎線"|"來分開子集合。可以盡可能多的包含子集合。
上面解釋的有點云里霧里,簡單點說,就是在建立緩存中,將cache_id以一個帶集合標識保存,用豎線隔開集合標識與緩存編號,而不僅僅是單一緩存編號,如:
1
2
|
$smarty ->display( "index.tpl" , "category|" . $cache_id ); //前面加了一個 category| 的前綴,表明將把緩存編號為$cache_id保存在category集合里,可以理解為分組; |
這里添加一個緩存文件如何命名知識點,緩存文件命名生成規則:集合名稱^_Site目錄_頁面名稱_參數_頁面名稱編碼md5加密
如下圖所示:
(category屬于一個集合,index屬于一個集合)
剛將了集合的生成,下面關鍵如何清除集合下的緩存,方法如下:
1
2
|
$smarty ->clear_cache(null, "category" ); //注意模板文件參數為null,""都不可以。 |
以上就完成了集合緩存的生成與清除,其實,網上也有這樣一種方法:給一個欄目新建一個目錄,比方news欄目,緩存生成放到一個news的緩存文件夾,這點不難,然后需要清除此欄目緩存時,緩存路徑指向news即可。這個方法可行,個人覺得靈活性不高。
好了,關于Smarty緩存機制原理的講解就完成了,當然這些只是實際開發常用的應用技巧,還有更多與緩存相關的函數、塊什么的,不過掌握這些,相信Smarty緩存就可以運用自如了。
希望本文所述對大家基于smarty模板的PHP程序設計有所幫助。
原文鏈接:https://www.cnblogs.com/trkjoy/articles/5173073.html