控制输出缓存
通常情况下,开启缓存可以让整个最终输出的页面被缓存下来。 然而,Smarty 3提供了几种在输出缓存中控制部分区域不进行缓存的方法。
一般说明
注意在不缓存的区域内使用的全部变量,在页面每次加载时都会从PHP里重新赋值。
模板区域缓存控制
模板内的一块区域可以很容易地通过 {nocache}
和{/nocache}
标签来设置不进行缓存。
- 今天是:
- {nocache}
- {$smarty.now|date_format}
- {/nocache}
上面的代码将在一个缓存的页面上输出当前日期时间。
标签的缓存控制
控制单个标签不进行缓存,可以为其加入"nocache"的属性。
- 今天是:
- {$smarty.now|date_format nocache}
变量的缓存控制
你可以通过assign()
来控制变量值不进行缓存。
说明
如果一个变量被设置了不缓存,那么它在页面每次加载时都会从PHP里重新赋值。
说明
变量不缓存的设置,会在编译后的代码中起效。所以如果你重新设置了某个变量不缓存,那么你需要删除已经存在的编译和缓存文件,使得模板可以重新编译并起效。
- // 赋值$foo,并将其设置成不缓存的变量
- $smarty->assign('foo',time(),true);
- 动态的时间值是: {$foo}
插件的缓存控制
你可以在注册一个插件时,同时控制插件的缓存。 registerPlugin()
的第三个参数是$cacheable
,其默认是TRUE
。
当你注册一个插件时,同时设置$cacheable=false
, 那么插件会在每次页面显示的时候都被调用,即使页面整体已经被缓存了。 插件函数的这个行为和{insert}
很相似。
说明
插件不缓存的设置,会在编译后的代码中起效。所以如果你重新设置了某个插件不缓存,那么你需要删除已经存在的编译和缓存文件,使得模板可以重新编译并起效。
对比{insert}
也可以默认让插件不进行缓存。 它们可以通过第四个参数$cache_attrs
来定义进行缓存。 $cache_attrs
定义了一个需要进行缓存的属性数组, 然后这些属性会被写入缓存,以供插件每次执行的时候直接读取。
- <?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里面读取出来并写入到模板,然后就一直是直接从缓存内读取了。
- 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}
标签来进行模板区域缓存控制
。