首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

Smarty 快取控制進階:局部不快取與插件註冊三種方法詳解

     編輯:PHP 綜合知識

應用場景

頁面整體快取,但部分需動態內容(如廣告條、即時時間、用戶資訊)不應被快取。Smarty 提供三種機制實現局部動態。

方法一:{insert} 標籤

模板 index.tpl:

<div>{insert name="get_current_time"}</div>

PHP:

function insert_get_current_time($params, &$smarty) {
    return date("Y-m-d H:i:s");
}

$smarty = new Smarty();
$smarty->caching = true;
if (!$smarty->is_cached('index.tpl')) {
    // 只在未快取時執行的邏輯(如資料庫查詢)
}
$smarty->display('index.tpl');

特點:函數名固定格式 insert_名稱,參數可選,每次顯示皆執行。

方法二:register_function 註冊自訂函數

模板:

<div>{current_time}</div>

PHP:

function smarty_function_current_time($params, &$smarty) {
    return date("Y-m-d H:i:s");
}

$smarty = new Smarty();
$smarty->caching = true;
// 第三參數 false 表示不快取輸出
$smarty->register_function('current_time', 'smarty_function_current_time', false);

if (!$smarty->is_cached('index.tpl')) { /* ... */ }
$smarty->display('index.tpl');

特點:以插件形式註冊,標籤名自訂,cacheable=false 強制動態執行。

方法三:register_block 區塊函數

適用於整段區塊動態(如廣告輪播區):

function smarty_block_dynamic_ads($params, $content, &$smarty, &$repeat) {
    if ($repeat) return; // 只執行一次
    // 取得廣告內容
    return get_ads_html();
}

$smarty->register_block('dynamic_ads', 'smarty_block_dynamic_ads', false);

模板:

{dynamic_ads}{/dynamic_ads}

參數傳遞說明

  • {insert name="func" arg1="val1"} → $params['arg1'] 可取得。
  • 第二參數 &$smarty 可存取 Smarty 物件所有屬性方法。

總結比較

方法適用場景標籤語法快取控制
{insert}單一動態值{insert name="xxx"}內建不快取
register_function自訂函數標籤{func_name}註冊時指定 cacheable=false
register_block整段區塊動態{block_name}...{/block_name}註冊時指定 cacheable=false
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved