前言
Smarty 是一個出色的PHP模板引擎,它分離了邏輯代碼和user interface。
學習和使用Smarty,沒有應用到它的緩衝技術是一個很大的損失,它可以將使用者最終看到的HMTL檔案快取成一個靜態HTML頁,當設定Smarty的cache屬性為true時,在Smarty設定的cachetime期內將使用者的WEB請求直接轉換到這個靜態HTML檔案中來,這相當於調用一個靜態HTML檔案,給後台伺服器減少很多負擔。
下載與配置
官方下載:Smarty Download
下載完後,解壓到自己項目的檔案目錄下。
1 require('../libs/Smarty.class.php');
2
3 $smarty = new Smarty;
4
5 //$smarty->force_compile = true; //強迫編譯
6 $smarty->debugging = true; //調試
7 $smarty->caching = true; //開啟緩衝
8 $smarty->cache_lifetime = 120; //緩衝存活時間(秒)
$smarty->cache_dir = MY_SMARTY_DIR . '/cache/' ; //設定緩衝的存放路徑
注意:如果你發現快取檔案每次瀏覽都會發生改變,請看 Smarty的 force_compile , 它會強迫Smarty每次調用(重新)編譯模板。這項設定不受$compile_check的限制。預設情況下,它是無效的。它對於開發和調試很方便.但它決不能使用於產品環境下.如果啟動了緩衝,每次將會重建快取檔案.
$smarty->force_compile = false; //強迫編譯
Smarty 緩衝技術
• 全域緩衝
• 局部緩衝
1. insert 法
2. 動態 block 法
3. 外掛程式 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
2.第2次瀏覽,有緩衝 Total Time 0.00308
這裡我的index.php裡只有幾行代碼,如果資料量大的話,就有明顯的區別。
局部緩衝技術
局部緩衝 = 部分緩衝, 就是一個頁面的緩衝中,並不是全都產生緩衝,可以自訂設定某個功能模組不產生緩衝,每次瀏覽都會更新資料;
例如:網頁顯示使用者的狀態、網頁的統計資料、廣告條等,這些資料的更新速度都非常快,不宜緩衝,這樣,局部緩衝便有用武之地了。
局部緩衝有3個方法:
一、insert法
insert 所包含的內容不會被緩衝,每次調用該模板都會重新執行該函數.
使用方法:
注意這裡的函數名一定要以insert開頭,模板中的name與之對應。
index.php
//定義一個時間來測試insert與普通assign的差別
$date = date("Y-m-d H:i:s");
$smarty->assign("date", $date);
//insert
function insert_get_current_time($date){
return date("Y-m-d H:i:s");
}
index.tpl
nocache:{insert name="get_current_time"}
cache: {$date}
然後看產生的快取檔案:得出結論 insert 每次調用該模板都會重新執行該函數
nocache:),$_smarty_tpl);?>
cache: 2012-06-04 15:46:52
這種方法簡單,但是如果要顯示的內容是一大塊的,就不宜使用了。
二、動態block 法
php中自訂塊
index.php
//smarty 3
// function declaration
function smarty_block_nocache ($param,$content,$smarty)
{
return $content;
}
// register with smarty
$smarty->registerPlugin("function","nocache", "smarty_block_nocache");
開始有提到過,Smarty3是用registerPlugin , Smarty2則是用register_block
index.tpl
{nocache}{$date}{/nocache}
然後看快取檔案 , 得出結論每次調用該模板都會重新執行$date
tpl_vars['date']->value;?>
三、外掛程式block 法
這個方法和第2個差不多,只是把php中的自訂塊,放到smarty目錄中的plugins檔案夾中。
在Smarty/plugins目錄下建一個檔案 block.nocache.php 內容如下:
function smarty_block_nocache($param, $content, $smarty)
{
return $content;
}
?>
tpl模板中的使用和第二個方法一樣
總結
可以總結出Smarty緩衝技術,能大大的提高網站的速度和品質,用法也比較簡單。
最後提醒一下的就是, Smarty產生的快取檔案的副檔名雖然是php,但並不會被當作php代碼來解析.
作者:那瞬間
http://www.bkjia.com/PHPjc/478175.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/478175.htmlTechArticle前言 Smarty 是一個出色的PHP模板引擎,它分離了邏輯代碼和user interface。 學習和使用Smarty,沒有應用到它的緩衝技術是一個很大的損失,它...