当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之缓存机制的更多相关文章

  1. 全面剖析Smarty缓存机制一[三种缓存方式]

    今天主要全面总结下Smarty模板引擎中强大的缓存机制,缓存机制有效减少了系统对服务器的压力,而这也是很多开发者喜欢Smarty的原因之一,由于篇幅较大,便于博友阅读,这篇文章将剖析Smarty缓存的 ...

  2. 全面剖析Smarty缓存机制二[清除缓存方法]

    前段时间,写了一篇 Smaryt缓存机制的几种缓存方式 ,详细介绍了三种缓存方式:全局缓存.部分缓存.局部缓存,以及通过is_cache()判断是否存在缓存来进行缓存生成.本来这篇早该完成,由于时间关 ...

  3. 【腾讯Bugly干货分享】彻底弄懂 Http 缓存机制 - 基于缓存策略三要素分解法

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/qOMO0LIdA47j3RjhbCWUEQ 作者:李 ...

  4. MyCat源码分析系列之——BufferPool与缓存机制

    更多MyCat源码分析,请戳MyCat源码分析系列 BufferPool MyCat的缓冲区采用的是java.nio.ByteBuffer,由BufferPool类统一管理,相关的设置在SystemC ...

  5. Java三大框架之——Hibernate中的三种数据持久状态和缓存机制

    Hibernate中的三种状态   瞬时状态:刚创建的对象还没有被Session持久化.缓存中不存在这个对象的数据并且数据库中没有这个对象对应的数据为瞬时状态这个时候是没有OID. 持久状态:对象经过 ...

  6. Spring缓存机制的理解

    在spring缓存机制中,包括了两个方面的缓存操作:1.缓存某个方法返回的结果:2.在某个方法执行前或后清空缓存. 下面写两个类来模拟Spring的缓存机制: package com.sin90lzc ...

  7. hibernate缓存机制(转)

    原文出处:http://www.cnblogs.com/wean/archive/2012/05/16/2502724.html 一.why(为什么要用Hibernate缓存?) Hibernate是 ...

  8. [转]Android ListView 与 RecyclerView 对比浅析—缓存机制

    从源码角度剖析ListView 与 RecyclerView 缓存机制的不同 https://zhuanlan.zhihu.com/p/23339185 原文地址:http://dev.qq.com/ ...

  9. HTML5应用缓存机制

    首先先上一张图: 用360浏览器的用户对这张图应该都是耳熟能详了吧,没错,当网络不通畅时使用360浏览器,便会有这张图弹出来.为什么没有网络还能弹出这一副画面呢?这就关乎HTML5的应用缓存机制了. ...

随机推荐

  1. Spring配置:用context:property-placeholder替换PropertyPlaceholderConfigurer

    1.有时候需要从properties文件中加载配置,以前的方式是这样的: <bean id="jdbcProperties" class="org.springfr ...

  2. DOS命令里面的EQ、NE、GT、LT、GE、LE分别是什么意思

    EQ 就是 EQUAL等于NQ 就是 NOT EQUAL不等于 GT 就是 GREATER THAN大于 LT 就是 LESS THAN小于 GE 就是 GREATER THAN OR EQUAL 大 ...

  3. Activiti创建表(三)

    创建Mysql 创建 mysql 数据库 activiti(名字任意):CREATE DATABASE activiti DEFAULT CHARACTER SET utf8; pom.xml < ...

  4. 【PowerOJ1754&网络流24题】负载平衡问题(费用流)

    题意: 思路: [问题分析] 转化为供求平衡问题,用最小费用最大流解决. [建模方法] 首先求出所有仓库存货量平均值,设第i个仓库的盈余量为A[i],A[i] = 第i个仓库原有存货量 - 平均存货量 ...

  5. [BZOJ3199][SDOI2013]escape:半平面交

    分析 好像叫V图什么的. 容易发现,对于每个点,其监视的范围就是这个点与其它所有点的垂直平分线分割平面后的半平面交.由于数据范围很小,所以我们可以直接枚举每个点,使用双端队列求出其监视的范围.若两个点 ...

  6. Linux驱动开发6——DDR内存分配

    1.kmalloc和kfree #include <linux/slab.h> void *kmalloc(size_t size, int flags); flag: GFP_ATOMI ...

  7. Python分析《武林外传》 -----转载

    转载原链接:http://www.cnblogs.com/fredkeke/p/8328387.html 我一向比较喜欢看武侠电影.小说,但是06年武林外传开播的时候并没有追剧,简单扫几眼之后发现他们 ...

  8. Java的参数传递是值传递?

    引用传递和值传递的区别.(不先说定义的都是在耍流氓!) 按值调用(call by value) : 在参数传递过程中,形参和实参占用了两个完全不同的内存空间.形参所存储的内容是实参存储内容的一份拷贝. ...

  9. 图书-软件架构:《Design Patterns: Elements of Reusable Object-Oriented Software》(即后述《设计模式》一书)

    ylbtech-图书-软件架构:<Design Patterns: Elements of Reusable Object-Oriented Software>(即后述<设计模式&g ...

  10. 用JS实现将十进制转化为二进制