麻辣堂|资源主站|开发论坛|在线手册
首页 Apache Linux Java MySQL 注册帮助 
PHP项目开发组是PHP开发资源网于2007组年建成立的项目开发团队,目前核心开发成员有27人, 项目协作成员8名.下设7个开发组,主要承接大/中型网站项目开发任务。

    由于开发任务较多,人员比较紧张,现面向社会招聘全职或者兼职开发人员,不管你是在校大学生,还是全职开发人员,以及SOHO都可以联系本站,我们可以长期合作,并为您带来丰厚的报酬。
  您现在的位置:PHP开发资源网 > 麻辣堂 > 详细资料
待解决
[原创]smarty的局部区域缓存
悬赏分:20 - 2007年08月22日

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}
{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的强大也远不止这些..

提问者:太阳雨   08-22 08:08
答复
路过。。。顺便帮顶:)
回答者:玉米づ冰冻可乐 - 瓦岗村民 8-22 09:10
我也来回答:
不管你有没有帮助我们,瓦岗寨8万村民将感谢你。。。。。

为防止灌水,您需要计算一道数学题: 答案:
98 + 46 = ? 请将计算结果填在上面

 
[]
©2007 PhpRes.COM