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

Smarty 緩存機制深度解析:全局/局部/多緩存、is_cached 判斷、清除策略與 register_block 進階用法

     編輯:PHP 相關知識

Smarty 緩存 ≠ 編譯:兩個完全不同的概念

很多開發者混淆「編譯」與「緩存」:

  • 編譯:.tpl → .php(預設開啟),每次請求仍需執行 PHP、查數據庫
  • 緩存:輸出 HTML 直接存檔,命中時繞過 PHP 執行與 DB 查詢,性能提升數量級

一、開啟全局緩存

<?php
$smarty->cache_dir = "/caches/";        // 緩存目錄(需可寫)
$smarty->caching = true;                // 開啟緩存
$smarty->cache_lifetime = 3600;         // 緩存壽命(秒)
?>

二、一個模板生成多個緩存(多緩存)

如文章詳情頁,同一模板對應不同文章 ID:

$smarty->display('article.tpl', $_GET['article_id']);
// 第二參數為 cache_id,自動生成獨立緩存文件

三、is_cached() 避免無效 DB 查詢

if (!$smarty->is_cached('article.tpl', $article_id)) {
    // 僅在緩存未命中時查詢數據庫
    $article = $db->getArticle($article_id);
    $smarty->assign('article', $article);
}
$smarty->display('article.tpl', $article_id);

四、清除緩存

$smarty->clear_all_cache();                    // 清除所有
$smarty->clear_cache('article.tpl');           // 清除模板所有緩存
$smarty->clear_cache('article.tpl', $cache_id); // 清除指定 cache_id

五、局部不緩存(三種方案)

方案 1:{insert} 標籤(推薦用於動態片段)

定義處理函數:function insert_xxx($params, &$smarty),模板中 {insert name=xxx}。
特點:每次請求都執行,不受緩存影響。

方案 2:register_block 區塊不緩存

// 定義 block 處理函數
function smarty_block_dynamic($params, $content, &$smarty) {
    return $content; // 直接返回內容,不緩存
}
// 註冊:第三參數 false 表示不緩存
$smarty->register_block('dynamic', 'smarty_block_dynamic', false);

模板使用:

{dynamic}這裡的內容每次都會重新執行{/dynamic}

方案 3:Block 插件(plugins/block.dynamic.php)

<?php
function smarty_block_dynamic($params, $content, &$smarty) {
    return $content;
}
?>

需修改 Smarty_Compiler.class.php 將該 block 預設緩存關閉:

// 找到此行並修改
if ($tag_command == 'dynamic') 
    $this->_plugins['block'][$tag_command] = array($plugin_func, null, null, null, false);
else
    $this->_plugins['block'][$tag_command] = array($plugin_func, null, null, null, true);

方案 4:register_function 函數不緩存

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

模板:{current_time} 每次請求輸出當前時間。

六、緩存目錄結構與命名

/caches/
  └── article.tpl/
        ├── 123.php    // cache_id = 123
        ├── 456.php
        └── .htaccess  // 防止直接訪問

七、生產環境最佳實踐

  1. 開發環境關閉緩存:$smarty->caching = false;
  2. 緩存目錄權限:PHP 進程需寫入權限,建議放在非 Web 可訪問路徑
  3. 合理設置 lifetime:高頻頁面 60-300s,低頻頁面 3600s+
  4. 主動清除策略:數據更新時(發文、評論、後台編輯)調用 clear_cache()
  5. 監控命中率:日誌記錄緩存命中/未命中,優化熱點頁面

Smarty 緩存機制靈活強大,關鍵在於「識別什麼可以緩存、什麼必須動態」,配合 is_cached() 與局部不緩存技術,能將頁面響應從百毫秒級壓縮到毫秒級。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved