W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
通常情況下,開(kāi)啟緩存可以讓整個(gè)最終輸出的頁(yè)面被緩存下來(lái)。 然而,Smarty 3提供了幾種在輸出緩存中控制部分區(qū)域不進(jìn)行緩存的方法。
注意在不緩存的區(qū)域內(nèi)使用的全部變量,在頁(yè)面每次加載時(shí)都會(huì)從PHP里重新賦值。
模板內(nèi)的一塊區(qū)域可以很容易地通過(guò) {nocache}
和{/nocache}
標(biāo)簽來(lái)設(shè)置不進(jìn)行緩存。
Example 15.10. 使模板的一塊區(qū)域不進(jìn)行緩存
今天是: {nocache} {$smarty.now|date_format} {/nocache}
上面的代碼將在一個(gè)緩存的頁(yè)面上輸出當(dāng)前日期時(shí)間。
控制單個(gè)標(biāo)簽不進(jìn)行緩存,可以為其加入"nocache"的屬性。
Example 15.11. 讓標(biāo)簽內(nèi)容不進(jìn)行緩存
今天是: {$smarty.now|date_format nocache}
你可以通過(guò)assign()
來(lái)控制變量值不進(jìn)行緩存。
如果一個(gè)變量被設(shè)置了不緩存,那么它在頁(yè)面每次加載時(shí)都會(huì)從PHP里重新賦值。
變量不緩存的設(shè)置,會(huì)在編譯后的代碼中起效。所以如果你重新設(shè)置了某個(gè)變量不緩存,那么你需要?jiǎng)h除已經(jīng)存在的編譯和緩存文件,使得模板可以重新編譯并起效。
Example 15.12. 控制變量不緩存
// 賦值$foo,并將其設(shè)置成不緩存的變量 $smarty->assign('foo',time(),true); 動(dòng)態(tài)的時(shí)間值是: {$foo}
你可以在注冊(cè)一個(gè)插件時(shí),同時(shí)控制插件的緩存。 registerPlugin()
的第三個(gè)參數(shù)是$cacheable
,其默認(rèn)是TRUE
。
當(dāng)你注冊(cè)一個(gè)插件時(shí),同時(shí)設(shè)置$cacheable=false
, 那么插件會(huì)在每次頁(yè)面顯示的時(shí)候都被調(diào)用,即使頁(yè)面整體已經(jīng)被緩存了。 插件函數(shù)的這個(gè)行為和{insert}
很相似。
插件不緩存的設(shè)置,會(huì)在編譯后的代碼中起效。所以如果你重新設(shè)置了某個(gè)插件不緩存,那么你需要?jiǎng)h除已經(jīng)存在的編譯和緩存文件,使得模板可以重新編譯并起效。
對(duì)比{insert}
也可以默認(rèn)讓插件不進(jìn)行緩存。 它們可以通過(guò)第四個(gè)參數(shù)$cache_attrs
來(lái)定義進(jìn)行緩存。 $cache_attrs
定義了一個(gè)需要進(jìn)行緩存的屬性數(shù)組, 然后這些屬性會(huì)被寫(xiě)入緩存,以供插件每次執(zhí)行的時(shí)候直接讀取。
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
內(nèi)容是:
時(shí)間還有: {remaining endtime=$obj->endtime}
即使頁(yè)面被緩存了,$obj
的倒計(jì)時(shí)也還是會(huì)在每次頁(yè)面刷新的時(shí)候改變。 endtime屬性僅在第一次頁(yè)面顯示的時(shí)候,被從db里面讀取出來(lái)并寫(xiě)入到模板,然后就一直是直接從緩存內(nèi)讀取了。
Example 15.14. 使模板內(nèi)一部分區(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
的內(nèi)容:
頁(yè)面創(chuàng)建于: {'0'|date_format:'%D %H:%M:%S'} {dynamic} 現(xiàn)在時(shí)間是: {'0'|date_format:'%D %H:%M:%S'} ... 做些其他事情 ... {/dynamic}
刷新頁(yè)面后你可以發(fā)現(xiàn)兩個(gè)日期的不同。一個(gè)是“動(dòng)態(tài)的”,另一個(gè)是“靜態(tài)的”。 你可以像上面的代碼一樣把任何東西放{dynamic}...{/dynamic}
標(biāo)簽內(nèi),來(lái)使其不緩存。
上面的例子是展示了動(dòng)態(tài)的區(qū)塊插件是如何工作的。 參見(jiàn)如何通過(guò){nocache}
和 {/nocache}
標(biāo)簽來(lái)進(jìn)行模板區(qū)域緩存控制
。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: