codecamp

Smarty控制输出缓存

控制输出缓存

通常情况下,开启缓存可以让整个最终输出的页面被缓存下来。 然而,Smarty 3提供了几种在输出缓存中控制部分区域不进行缓存的方法。

一般说明

注意在不缓存的区域内使用的全部变量,在页面每次加载时都会从PHP里重新赋值。

模板区域缓存控制

模板内的一块区域可以很容易地通过 {nocache} 和{/nocache} 标签来设置不进行缓存。

Example 15.10. 使模板的一块区域不进行缓存

今天是:
{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);

动态的时间值是: {$foo}

插件的缓存控制

你可以在注册一个插件时,同时控制插件的缓存。 registerPlugin() 的第三个参数是$cacheable,其默认是TRUE

当你注册一个插件时,同时设置$cacheable=false, 那么插件会在每次页面显示的时候都被调用,即使页面整体已经被缓存了。 插件函数的这个行为和{insert}很相似。

说明

插件不缓存的设置,会在编译后的代码中起效。所以如果你重新设置了某个插件不缓存,那么你需要删除已经存在的编译和缓存文件,使得模板可以重新编译并起效。

对比{insert}也可以默认让插件不进行缓存。 它们可以通过第四个参数$cache_attrs来定义进行缓存。 $cache_attrs定义了一个需要进行缓存的属性数组, 然后这些属性会被写入缓存,以供插件每次执行的时候直接读取。

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. 使模板内一部分区域不缓存

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的内容:

页面创建于: {'0'|date_format:'%D %H:%M:%S'}

{dynamic}

现在时间是: {'0'|date_format:'%D %H:%M:%S'}

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

{/dynamic}

刷新页面后你可以发现两个日期的不同。一个是动态的,另一个是静态的。 你可以像上面的代码一样把任何东西放{dynamic}...{/dynamic}标签内,来使其不缓存。

说明

上面的例子是展示了动态的区块插件是如何工作的。 参见如何通过{nocache}和 {/nocache}标签来进行模板区域缓存控制

Smarty缓存组
Smarty自定义缓存实现
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

I.Smarty基础

1.Smart是什么?

II.Smarty模板设计师篇

6.Smarty复合修饰器

9.Smarty配置文件

10.Smarty调试控制台

III. 程序开发者篇

11. Smarty字符集编码

12.Smarty常量

13.Smarty成员变量

14.Smarty成员方法

17.Smarty高级特性

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }