smarty之缓存机制
当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');
?>
test.tpl:
<html>
<body> {$name} {$smarty.now|date_format:"%Y-%m-%d %H %M %S"}
当此tpl文件内容改变时,则会 重新生成新缓存
</body>
</html>
当smarty开启缓存时,当tpl文件内容不改变,而test.php文件改变时,则不生成缓存,虽然此种情况下不生成缓存,但是test.php文件里的内容也被执行了
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','修改test.php的文件内容则不会生成缓存,虽然不生成缓存,但是test.php文件里的内容还是执行了,只是此行的assign函数没有重新解析!');
echo 123;//此行执行了
$_smarty->display('test.tpl');
?>
test.tpl:
<html>
<body> {$name} {$smarty.now|date_format:"%Y-%m-%d %H %M %S"} </body>
</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
<?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',$_SERVER["REQUEST_URI"]);
?>
使用is_cached()函数,这种是最常用的.即访问test.php时,当url地址不变,则直接执行缓存文件,而不再执行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;
//is_cached是否存在缓存
//如果存在缓存,就不执行if语句里面的代码,否则就执行
if(!$_smarty->is_cached('test.tpl',$_SERVER["REQUEST_URI"])) {
echo '如果test.php的url不变,即使此if语句内的业务逻辑代码改变,也不会被执行,而是直接执行缓存文件';
} $_smarty->assign('name','测试缓存');
$_smarty->display('test.tpl',$_SERVER["REQUEST_URI"]);
?>
设置局部不缓存,比如,时间
可以创建一个局部块,然后注册到模板中去,指定块包含的内容不缓存,由于块是被缓存过的,所以要设置块本身不被缓存才行, 可以在第三个参数指定为false才可以即:(测试时要清理编译文件和缓存文件)
test.php:
<?php require 'smarty.inc.php';
function no_cache($_arr,$_content) {
return $_content;
}
$_smarty->register_block('nocache','no_cache',true); $_smarty->display('test.tpl',$_SERVER["REQUEST_URI"]);
?>
test.tpl:
<html>
<body>
{nocache}
{$smarty.now|date_format:"%Y-%m-%d %H %M %S"}
{/nocache}
</body>
</html>
为了方便起见,可以把局部缓存块做成插件形式,但要注意,块是默认被缓存的,需要在Smarty_Compiler.class.php里修改
1,在plugins文件夹下注册块文件(函数):block.nocache.php
function smarty_block_nocache($params, $content)
{
return $content;
}
2,查找$this->_plugins['block'][$tag_command] = array($plugin_func, null, null, null, true);并修改成(714行代码处):
if ($tag_command == 'nocache') {
$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);
}
smarty之缓存机制的更多相关文章
- 全面剖析Smarty缓存机制一[三种缓存方式]
今天主要全面总结下Smarty模板引擎中强大的缓存机制,缓存机制有效减少了系统对服务器的压力,而这也是很多开发者喜欢Smarty的原因之一,由于篇幅较大,便于博友阅读,这篇文章将剖析Smarty缓存的 ...
- 全面剖析Smarty缓存机制二[清除缓存方法]
前段时间,写了一篇 Smaryt缓存机制的几种缓存方式 ,详细介绍了三种缓存方式:全局缓存.部分缓存.局部缓存,以及通过is_cache()判断是否存在缓存来进行缓存生成.本来这篇早该完成,由于时间关 ...
- 【腾讯Bugly干货分享】彻底弄懂 Http 缓存机制 - 基于缓存策略三要素分解法
本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/qOMO0LIdA47j3RjhbCWUEQ 作者:李 ...
- MyCat源码分析系列之——BufferPool与缓存机制
更多MyCat源码分析,请戳MyCat源码分析系列 BufferPool MyCat的缓冲区采用的是java.nio.ByteBuffer,由BufferPool类统一管理,相关的设置在SystemC ...
- Java三大框架之——Hibernate中的三种数据持久状态和缓存机制
Hibernate中的三种状态 瞬时状态:刚创建的对象还没有被Session持久化.缓存中不存在这个对象的数据并且数据库中没有这个对象对应的数据为瞬时状态这个时候是没有OID. 持久状态:对象经过 ...
- Spring缓存机制的理解
在spring缓存机制中,包括了两个方面的缓存操作:1.缓存某个方法返回的结果:2.在某个方法执行前或后清空缓存. 下面写两个类来模拟Spring的缓存机制: package com.sin90lzc ...
- hibernate缓存机制(转)
原文出处:http://www.cnblogs.com/wean/archive/2012/05/16/2502724.html 一.why(为什么要用Hibernate缓存?) Hibernate是 ...
- [转]Android ListView 与 RecyclerView 对比浅析—缓存机制
从源码角度剖析ListView 与 RecyclerView 缓存机制的不同 https://zhuanlan.zhihu.com/p/23339185 原文地址:http://dev.qq.com/ ...
- HTML5应用缓存机制
首先先上一张图: 用360浏览器的用户对这张图应该都是耳熟能详了吧,没错,当网络不通畅时使用360浏览器,便会有这张图弹出来.为什么没有网络还能弹出这一副画面呢?这就关乎HTML5的应用缓存机制了. ...
随机推荐
- MySql中报错:java.sql.SQLException: Incorrect string value: '\xF0\x9F\x90\xBB' for column
问题描述: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x90\xBB' for column 'nickName' at row ...
- SQL Server函数大全(三)----Union与Union All的区别
如果我们需要将两个select语句的结果作为一个整体显示出来,我们就需要用到union或者union all关键字.union(或称为联合)的作用是将多个结果合并在一起显示出来. union和unio ...
- 年薪100万的人都是怎么玩Excel的?
年薪100万的人都是怎么玩Excel的? 2017-12-21 13:42美国 作者:珍妮Jenny 来源:一周进步(ID:weekweekup) 本文已获原作者转载授权,如需转载请联系原公号 本文重 ...
- 通用 C# DLL 注入器injector(注入dll不限)
为了方便那些不懂或者不想用C++的同志,我把C++的dll注入器源码转换成了C#的,这是一个很简单实用的注入器,用到了CreateRemoteThread,WriteProcessMemory ,Vi ...
- vb语法
If IsNull(rs(0)) = False Then picPath = rs(0) End If 判断查询数据库结果集是否为null, 如果用rs(0)则会报错,这样获取不到这条记录的null ...
- 小程序mpvue中动态切换echarts图表
如果你用mpvue,而且还想用echarts,那么这个包你可以以来一下 https://github.com/F-loat/mpvue-echarts 考虑到多个页面都休要用,所以抽出来作为一个组件, ...
- oracle 11g 数据库恢复技术 ---04 rman
四 RMAN RMAN体系结构的主要组成部分: --1 目标数据库(target) --2 RMAN命令行客户端 --3 通道(channel) --4 快速恢复区(fast recovery are ...
- Linux命令整理 - 通用版
通用版 - 系统架构 /dev 设备文件夹 null 有去无回 mouse /sbin 系统管理必备程序 cfdisk.dhcpcd.dump.e2fsck.fdisk.halt.ifconfig.i ...
- java程序利用ansible修改redis服务参数
第一步,java调用shell paraname和paravalue是传给playbook的变量. try { String cmd5 = "sudo ansible-playbook /s ...
- 14 (H5*) JS第4天 函数、作用域、预解析
目录 1:函数的其他定义 2:函数作为参数 3:函数作为返回值 4:作用域 5:作用域链 6:预解析 7:预解析分段 复习 <script> /* * 复习: * 函数:把一些重复的代码封 ...