当smarty开启缓存时,当tpl文件内容改变时,则缓存页面会重新生成
test.php: <?php date_default_timezone_set('asia/shanghai'); header("Content-type: text/html; charset=utf-8"); require 'smarty/Smarty.class.php'; $_smarty = new Smarty(); $_smarty->caching = true; $_smarty->assign('name','测试缓存'); $_smarty->display('test.tpl'); ?>
1 test.tpl: 2 <html> 3 <body> 4 5 {$name} {$smarty.now|date_format:"%Y-%m-%d %H %M %S"} 6 当此tpl文件内容改变时,则会 重新生成新缓存 7 </body> 8 </html>
当smarty开启缓存时,当tpl文件内容不改变,而test.php文件改变时,则不生成缓存,虽然此种情况下不生成缓存,但是test.php文件里的内容也被执行了
1 test.php: 2 <?php 3 date_default_timezone_set('asia/shanghai'); 4 header("Content-type: text/html; charset=utf-8"); 5 require 'smarty/Smarty.class.php'; 6 $_smarty = new Smarty(); 7 $_smarty->caching = true; 8 9 $_smarty->assign('name','修改test.php的文件内容则不会生成缓存,虽然不生成缓存,但是test.php文件里的内容还是执行了,只是此行的assign函数没有重新解析!'); 10 echo 123;//此行执行了 11 $_smarty->display('test.tpl'); 12 ?>
1 test.tpl: 2 <html> 3 <body> 4 5 {$name} {$smarty.now|date_format:"%Y-%m-%d %H %M %S"} 6 7 </body> 8 </html>
当smarty开启缓存时,tpl文件内容不变,而test.php中的$_smarty->display('test.tpl',$_SERVER["REQUEST_URI"]);里的display方法里的第二个参数值改变时,则test.php里的display方法会重新执行,则会重新生成缓存文件,并且生成的是新的缓存文件名如:一个页面有多篇文章的情况下:
http://website/index.php?p=1
http://website/index.php?p=2
1 <?php 2 date_default_timezone_set('asia/shanghai'); 3 header("Content-type: text/html; charset=utf-8"); 4 require 'smarty/Smarty.class.php'; 5 $_smarty = new Smarty(); 6 $_smarty->caching = true; 7 8 $_smarty->assign('name','当参数值改变时则会重新生成一个新的缓存文件'); 9 10 $_smarty->display('test.tpl',$_SERVER["REQUEST_URI"]); 11 ?>
使用is_cached()函数,这种是最常用的.即访问test.php时,当url地址不变,则直接执行缓存文件,而不再执行test.php里面的业务逻辑
1 <?php 2 date_default_timezone_set('asia/shanghai'); 3 header("Content-type: text/html; charset=utf-8"); 4 require 'smarty/Smarty.class.php'; 5 $_smarty = new Smarty(); 6 $_smarty->caching = true; 7 //is_cached是否存在缓存 8 //如果存在缓存,就不执行if语句里面的代码,否则就执行 9 if(!$_smarty->is_cached('test.tpl',$_SERVER["REQUEST_URI"])) { 10 echo '如果test.php的url不变,即使此if语句内的业务逻辑代码改变,也不会被执行,而是直接执行缓存文件'; 11 } 12 13 $_smarty->assign('name','测试缓存'); 14 $_smarty->display('test.tpl',$_SERVER["REQUEST_URI"]); 15 ?>
设置局部不缓存,比如,时间
可以创建一个局部块,然后注册到模板中去,指定块包含的内容不缓存,由于块是被缓存过的,所以要设置块本身不被缓存才行, 可以在第三个参数指定为false才可以即:(测试时要清理编译文件和缓存文件)
1 test.php: 2 <?php 3 4 require 'smarty.inc.php'; 5 function no_cache($_arr,$_content) { 6 return $_content; 7 } 8 $_smarty->register_block('nocache','no_cache',true); 9 10 $_smarty->display('test.tpl',$_SERVER["REQUEST_URI"]); 11 ?>
1 test.tpl: 2 <html> 3 <body> 4 {nocache} 5 {$smarty.now|date_format:"%Y-%m-%d %H %M %S"} 6 {/nocache} 7 </body> 8 </html>
为了方便起见,可以把局部缓存块做成插件形式,但要注意,块是默认被缓存的,需要在Smarty_Compiler.class.php里修改
1,在plugins文件夹下注册块文件(函数):block.nocache.php
1 function smarty_block_nocache($params, $content) 2 { 3 return $content; 4 }
2,查找$this->_plugins['block'][$tag_command] = array($plugin_func, null, null, null, true);并修改成(714行代码处):
1 if ($tag_command == 'nocache') { 2 $this->_plugins['block'][$tag_command] = array($plugin_func, null, null, null, false); 3 } else { 4 $this->_plugins['block'][$tag_command] = array($plugin_func, null, null, null, true); 5 }