Smarty 作為 PHP 經典模板引擎,其內建快取系統是提升頁面響應速度的利器。本文系統梳理 Smarty 快取的五大核心模式——啟用與基礎配置、清除策略、全域快取、區域快取、局部快取,並延伸介紹自定義快取處理器,幫助開發者根據業務場景精準選型。
$smarty->caching = true; // 開啟快取(1 或 true)
$smarty->cache_dir = './cache/'; // 快取目錄(需可寫權限)
$smarty->cache_lifetime = 3600; // 生存時間(秒),-1 表示永不過期
多快取區分:對同一模板生成不同快取,使用 cache_id:
$smarty->display('index.tpl', $my_cache_id);
典型場景:根據 $_GET 參數區分(如分頁、篩選條件),將 md5($_SERVER['REQUEST_URI']) 作為 cache_id,確保不同 URL 對應獨立快取。
$smarty->clear_all_cache(); // 清除所有快取
$smarty->clear_cache('index.tpl'); // 清除指定模板所有快取
$smarty->clear_cache('index.tpl', $cache_id); // 清除指定模板指定 ID 快取
建議:內容更新後(發布文章、修改商品)立即呼叫對應清除方法,或配合定時任務定期清理過期快取。
為整站所有頁面生成快取。配置同上,關鍵在於 display() 呼叫時傳入唯一 cache_id:
$smarty->display('list2.html', md5($_SERVER['REQUEST_URI']));
避坑指南:若不傳 cache_id,預設以模板檔名哈希為快取鍵,會導致 article.php?id=5 和 article.php?id=7 共用同一快取,造成內容錯亂。務必包含完整請求參數。
實質是「指定不快取的頁面」。對需快取的頁面正常呼叫 display();對不需快取的頁面(如即時資訊、用戶個人中心),在 display() 前呼叫:
$smarty->clear_cache('article.tpl'); // 清除該模板可能存在的快取
$smarty->display('article.tpl'); // 正常渲染,不產生快取
注意:clear_cache 與 display 的模板參數必須一致。
頁面整體快取,但保留特定區塊即時更新(如當前時間、購物車數量、用戶名)。實現方式:自定義插入函數(insert_ 前綴)。
function insert_timeget() {
return time(); // 每次呼叫返回當前時間戳
}
<body>
{$time}<!-- 快取後固定不變 -->
{insert name='timeget'}<!-- 快取後仍實時更新 -->
</body>
原理:Smarty 編譯時識別 {insert name='xxx'},執行階段動態呼叫 insert_xxx(),繞過快取輸出。
若預設檔案快取不滿足需求(如需存 Redis、Memcached、資料庫),可實現 cache_handler_func:
$smarty->cache_handler_func = 'myCache';
function myCache($action, &$smarty_obj, &$cache_content, $tpl_file = null, $cache_id = null, $compile_id = null) {
switch ($action) {
case 'read':
// 從 Redis 讀取 $cache_content
return true; // 成功返回 true,失敗 false
case 'write':
// 將 $cache_content 寫入 Redis
return true;
case 'clear':
// 清除對應快取
return true;
}
}
適用場景:分散式部署共享快取、快取資料需持久化、需實現快取標籤/分組失效等高級功能。
| 模式 | 適用場景 | 關鍵 API |
|---|---|---|
| 全域快取 | 內容型站點、靜態化程度高的頁面 | display(tpl, md5(REQUEST_URI)) |
| 區域快取 | 大部分頁面快取,少數頁面動態 | clear_cache(tpl); display(tpl) |
| 局部快取 | 頁面整體快取,小區塊即時 | insert_xxx() + {insert name='xxx'} |
| 自定義處理器 | 叢集環境、非檔案存儲、高級失效策略 | cache_handler_func |
Smarty 快取機制靈活強大,核心在於「以靜制動,動靜分離」。實際專案中建議:預設全域快取 + 業務頁面區域排除 + 關鍵區塊局部動態,配合自定義處理器解決分散式快取共享問題。合理設定 cache_lifetime 並建立完善的快取失效機制(內容更新觸發清除),即可在保證數據一致性的前提下極大提升吞吐量。