smarty的局部区域缓存

smarty的庞大身躯一直为人所诟病,但其功能"强大"却是不得不令人叹服.
对模板引擎来说,缓存是必不可少的,smarty在这方面同样是优秀的,它拥有众多令人可喜的功能:
1)可在同一程序中对不同模板文件使用不同的缓存时间
2)可使用不同的cache_id实现同一模板的不同缓存(想起asp.net的根椐$request缓存),这对统一入口的程序很有用,可以根椐url来生成不同的缓存
3)可使用$cache_handler_func来使用自定义缓存处理函数
4)可控性强,可对同一文件的部分设定是否缓存

以下内容主要是对局部缓存所作的探讨.

局部缓存的作用很明显,主要用于同一页中既有需要缓存的内容,又有不适宜缓存的内容的情况.
关于常规的局部缓存使用方法,smarty文档中有例子(http://smarty.php.net/manual/en/caching.cacheable.php),但这些方法都不够方便
以下是我的插件改造方法,将该功能改成一个插件:
1)定义一件插件函数:block.cacheless.php,放在smarty的plugins目录
block.cacheless.php的内容如下:
[php]
<?php
function smarty_block_cacheless($param, $content, &$smarty) {
        return $content;
}
?>
[/php]

2) 编写程序及模板
示例程序:testCacheLess.php
[php]
<?php
include('Smarty.class.php');
$smarty = new Smarty;
$smarty->caching=true;
$smarty->cache_lifetime = 6;
$smarty->display('cache.tpl');
?>
[/php]
所用的模板:cache.tpl
[php]
已经缓存的:{$smarty.now}<br>
{cacheless}
没有缓存的:{$smarty.now}
{/cacheless}
[/php]

现在运行一下,发现是不起作用的,两行内容都被缓存了

3)改写Smarty_Compiler.class.php(注:该文件很重要,请先备份,以在必要时恢复)
查找:
$this->_plugins['block'][$tag_command] = array($plugin_func, null, null, null, true); //我的在705行
修改成:
if($tag_command == 'cacheless') $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);

你也可以直接将原句的最后一个参数改成false,我对smarty的内部机制不太了解,所以加了一个判断,只要block是cacheless的才不作缓存

4)OK,现在清除template_c里的编译文件,重新运行,起作用了吧?

经过这些改造,以后只需要在模板定义中,不需要缓存的部分(实时比分,广告,时间等)使用{cacheless}不需缓存的内容{/cacheless}即可

后话:小学时美术老师说过一盒十二色的蜡笔就可以绘出生活的全部,但当我第一次见到一盒二十四色的水彩笔时才知道,原来生活远不止这些
同样,当你用心去发现,smarty的强大也远不止这些..

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值