前言
Smarty 是一個出色的PHP模板引擎,它分離了邏輯代碼和user interface。
學習和使用Smarty,沒有應用到它的緩存技術是一個很大的損失,它可以將用戶最終看到的HMTL文件緩存成一個靜態的HTML頁,當設定Smarty的cache屬性為true時,在Smarty設定的cachetime期內將用戶的WEB請求直接轉換到這個靜態的HTML文件中來,這相當於調用一個靜態的HTML文件,給後台服務器減少很多負擔。
下載與配置
官方下載:Smarty Download
下載完後,解壓到自己項目的文件目錄下。
復制代碼 代碼如下:
require('../libs/Smarty.class.php');
$smarty = new Smarty;
//$smarty->force_compile = true; //強迫編譯
$smarty->debugging = true; //調試
$smarty->caching = true; //開啟緩存
$smarty->cache_lifetime = 120; //緩存存活時間(秒)
$smarty->cache_dir = MY_SMARTY_DIR . '/cache/' ; //設置緩存的存放路徑
注意:如果你發現緩存文件每次浏覽都會發生改變,請看 Smarty的 force_compile , 它會強迫Smarty每次調用(重新)編譯模板。這項設置不受$compile_check的限制。默認情況下,它是無效的。它對於開發和調試很方便.但它決不能使用於產品環境下.如果啟動了緩存,每次將會重新生成緩存文件.
$smarty->force_compile = false; //強迫編譯
Smarty 緩存技術
全局緩存
局部緩存
insert 法
動態 block 法
插件 block 法
全局緩存技術
顧名思義,全局緩存就是把整個頁面生成緩存文件,指定該緩存文件的存活時間,在指定時間內再次浏覽整個頁面,將直接讀取緩存文件。
復制代碼 代碼如下:
$smarty->caching = true; //開啟緩存
$smarty->cache_lifetime = 120; //緩存存活時間(秒)
注意:一個模板只能有一個緩存文件,如果您的模板存在多個頁面的話,就要為緩存 設置一個ID。 例如一個頁面有多個文章:
http://website/index.php?p=1
http://website/index.php?p=2
復制代碼 代碼如下:
//$_SERVER['REQUEST_URI']方法
//將當前頁面的URL(包含?後面的所有參數)進行md5加密
$url=md5($_SERVER['REQUEST_URI']);
//設置緩存文件名
$smarty->display('index.tpl',$url);
重點:使用緩存技術,很大一個原因就是為了減少對數據庫的讀寫,所以我們要用$smarty->isCached('index.tpl')來判斷緩存是否存在,如果存在了就不要再次操作數據庫。
復制代碼 代碼如下:
if(!$smarty->isCached('index.tpl')){
echo "ACACHE NO FOUND!";
$sql = "SELECT * FROM test";
$query = mysql_query($sql);
$row = mysql_fetch_row($query);
$smarty->assign("loaddatabase",$row[1]);
}
這裡又有問題了,如果我改了數據庫的某個內容,想更新顯示內容,但是緩存又還沒到消亡時間,那該腫麼辦呢?
$smarty->clearCache("index.tpl");
上面的clearCache可以解決這個問題,只要更新了數據後,調用clearCache清除一下緩存就可以了。
PS:我用的是Smarty3版本,這個版本很多方法的命名都發生變化了,如果是Smarty2的話會出現“Call of unknown method ‘isCached'.”,請使用$smarty->is_cached()。
後面出現的 Smarty3:registerPlugin(), Smarty2:register_block() 也一樣是版本的問題。
下面我們來看一下有緩存和沒緩存的速度比較:
1.首次浏覽,沒有緩存 Total Time 0.01421