Smarty控制輸出緩存

2018-12-09 11:37 更新

控制輸出緩存

通常情況下,開啟緩存可以讓整個最終輸出的頁面被緩存下來。 然而,Smarty 3提供了幾種在輸出緩存中控制部分區(qū)域不進行緩存的方法。

一般說明

注意在不緩存的區(qū)域內使用的全部變量,在頁面每次加載時都會從PHP里重新賦值。

模板區(qū)域緩存控制

模板內的一塊區(qū)域可以很容易地通過 {nocache} 和{/nocache} 標簽來設置不進行緩存。

Example 15.10. 使模板的一塊區(qū)域不進行緩存

今天是:
{nocache}
{$smarty.now|date_format}
{/nocache}

上面的代碼將在一個緩存的頁面上輸出當前日期時間。


標簽的緩存控制

控制單個標簽不進行緩存,可以為其加入"nocache"的屬性。

Example 15.11. 讓標簽內容不進行緩存

今天是:
{$smarty.now|date_format nocache}

變量的緩存控制

你可以通過assign()來控制變量值不進行緩存。

說明

如果一個變量被設置了不緩存,那么它在頁面每次加載時都會從PHP里重新賦值。

說明

變量不緩存的設置,會在編譯后的代碼中起效。所以如果你重新設置了某個變量不緩存,那么你需要刪除已經存在的編譯和緩存文件,使得模板可以重新編譯并起效。

Example 15.12. 控制變量不緩存

// 賦值$foo,并將其設置成不緩存的變量
$smarty->assign('foo',time(),true);

動態(tài)的時間值是: {$foo}

插件的緩存控制

你可以在注冊一個插件時,同時控制插件的緩存。 registerPlugin() 的第三個參數是$cacheable,其默認是TRUE

當你注冊一個插件時,同時設置$cacheable=false, 那么插件會在每次頁面顯示的時候都被調用,即使頁面整體已經被緩存了。 插件函數的這個行為和{insert}很相似。

說明

插件不緩存的設置,會在編譯后的代碼中起效。所以如果你重新設置了某個插件不緩存,那么你需要刪除已經存在的編譯和緩存文件,使得模板可以重新編譯并起效。

對比{insert}也可以默認讓插件不進行緩存。 它們可以通過第四個參數$cache_attrs來定義進行緩存。 $cache_attrs定義了一個需要進行緩存的屬性數組, 然后這些屬性會被寫入緩存,以供插件每次執(zhí)行的時候直接讀取。

Example 15.13. 控制插件的緩存

<?php
$smarty->setCaching(Smarty::CACHING_LIFETIME_CURRENT);

function remaining_seconds($params, $smarty) {
    $remain = $params['endtime'] - time();
    if($remain >= 0){
        return $remain . ' second(s)';
    }else{
        return 'done';
    }
}

$smarty->registerPlugin('function','remaining', 'remaining_seconds', false, array('endtime'));

if (!$smarty->isCached('index.tpl')) {
    // 從db獲取$obj 并賦值...
    $smarty->assignByRef('obj', $obj);
}

$smarty->display('index.tpl');
?>

模板index.tpl 內容是:

時間還有: {remaining endtime=$obj->endtime}

即使頁面被緩存了,$obj的倒計時也還是會在每次頁面刷新的時候改變。 endtime屬性僅在第一次頁面顯示的時候,被從db里面讀取出來并寫入到模板,然后就一直是直接從緩存內讀取了。


Example 15.14. 使模板內一部分區(qū)域不緩存

index.php:

<?php
$smarty->setCaching(Smarty::CACHING_LIFETIME_CURRENT);

function smarty_block_dynamic($param, $content, $smarty) {
    return $content;
}
$smarty->registerPlugin('block','dynamic', 'smarty_block_dynamic', false);

$smarty->display('index.tpl');
?>

模板index.tpl的內容:

頁面創(chuàng)建于: {'0'|date_format:'%D %H:%M:%S'}

{dynamic}

現在時間是: {'0'|date_format:'%D %H:%M:%S'}

... 做些其他事情 ...

{/dynamic}

刷新頁面后你可以發(fā)現兩個日期的不同。一個是動態(tài)的,另一個是靜態(tài)的。 你可以像上面的代碼一樣把任何東西放{dynamic}...{/dynamic}標簽內,來使其不緩存。

說明

上面的例子是展示了動態(tài)的區(qū)塊插件是如何工作的。 參見如何通過{nocache}和 {/nocache}標簽來進行模板區(qū)域緩存控制。

以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號