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的应用缓存机制了. ...
随机推荐
- webpack配置反向代理
devServer: { contentBase: path.resolve(__dirname, "../dev"), compress: true, port: ,//本身的端 ...
- VS2019界面透明、主题修改和导出设置
目录 安装插件Color Theme Editor for Visual Studio 2019和ClaudiIDE 导入主题 背景修改 效果预览 导出设置遇到错误924 其他帮助文档 我自己用的主题 ...
- 【PowerOJ1741&网络流24题】最长递增子序列问题(最大流)
题意: 思路: [问题分析] 第一问时LIS,动态规划求解,第二问和第三问用网络最大流解决. [建模方法] 首先动态规划求出F[i],表示以第i位为开头的最长上升序列的长度,求出最长上升序列长度K. ...
- Swift equality
最后更新: 2017-07-23 在程序开发中,我们时常需要来判断两个对象是否相等.在编程思想中,两个对象相等指的是在内存中的地址相同,也就是两个指针指向同一个地址.但是在日常理解中,只要两个对象的内 ...
- 音频学习(一)-离线播放(AVAudioPlayer)
最后更新:2017-05-23 方法 - (nullable instancetype)initWithContentsOfURL:(NSURL *)url error:(NSError **)out ...
- [CSP-S模拟测试]:老司机的狂欢(LIS+LCA)
题目背景 光阴荏苒.不过,两个人还在,两支车队还在,熟悉的道路.熟悉的风景,也都还在.只是,这一次,没有了你死我活的博弈,似乎和谐了许多.然而在机房是不允许游戏的,所以班长$XZY$对游戏界面进行了降 ...
- android发送udp,tcp消息
发送方创建步骤: 1. 创建一个DatagramSocket对象 DatagramSocket socket = new DatagramSocket (4567); 2. 创建一个 InetA ...
- 大数据笔记(四)——操作HDFS
一.Web Console:端口50070 二.HDFS的命令行操作 (一)普通操作命令 HDFS 操作命令帮助信息: hdfs dfs + Enter键 常见命令 1. -mkdir 在HDFS上 ...
- React Native商城项目实战11 - 个人中心头部内容
1.创建MineHeaderView.js /** * 个人中心头部内容 */ import React, { Component } from 'react'; import { AppRegist ...
- jenkins执行 pod install 报错 CocoaPods requires your terminal to be using UTF-8 encoding. Consider adding the following to ~/.profile:
错误提示是: CocoaPods 需要终端使用utf-8编码 解决办法