Smarty缓存机制实例详解【三种缓存方式】


Posted in PHP onJuly 20, 2019

本文实例讲述了Smarty缓存机制。分享给大家供大家参考,具体如下:

Smarty模板引擎中强大的缓存机制,缓存机制有效减少了系统对服务器的压力,而这也是很多开发者喜欢Smarty的原因之一,附录中讲解了设置缓存及清除缓存的技巧方法(其中包含缓存集合方法)。

一、Smarty缓存的几种方式

缓存机制中,分为全局缓存、部分缓存、局部缓存三种方式,后面会一一讲述,下面是缓存设置前,Smarty类方法基本目录设置如下:

$smarty->Smarty();
$smarty->template_dir = $ROOT."/templates";//模板目录
$smarty->compile_dir = $ROOT."/templates_c";//编译目录
$smarty->cache_dir = $ROOT."/cache";//缓存目录
$smarty->caching = true;//是否开启缓存,值为0,1,2,0则不开启:1则开启缓存:2则可设置特殊缓存,即在加载模板页前,对局部进行缓存时间的特殊设定,后面会讲到;可不写,默认为true-开启
$smarty->cache_lifetime = "3600";//缓存时间 ,可不写,默认为3600
$smarty->compile_check = true;//是否进行编译,可不写,默认为true

缓存机制中调用模板生成缓存页面,用的一个display()方法,将会在后文中用到,这里先讲解一下:

$smarty->display(string template[, string cache_id[, string compile_id]]);

第一个必须参数:template,为需显示的模板;
第二个可选参数:cache_id,可指定一个缓存号,此参数是给页面缓存添加一个标识的作用;
第三个可选参数:compile_id,可指定一个编译号 ,此参数是把一个模板编译成不同版本时使用,同样是起一个标识的作用,不常用。

上面代码简洁、说明易懂吧!若引用创建Smarty类都不知,那下面可以省了,呵,开个玩笑!接着往下看。

1、全局缓存方式

定义:字面上看,意思很明了,就是为整个网站的全部页面都进行缓存生成,只要页面调用了Smarty类模板。

代码实例:其实,在这段之前的基本目录设置中就讲到了,为说明,用蓝颜色标明了出来代码,只要在类中这样设置,并在页面中进行如下引用,页面即进行了缓存,

$smarty->display('index.tpl');

而这条语句,有一个很大的缺陷,就是一个模板即一个模板页面,只生成一个缓存,而我们知道,大多网站的多数页面后面会接一些参数或不同页面调用同一个模板,比如:

http://blog.unvs.cn/archives/2012_9.html
http://blog.unvs.cn/archives/2012_8.html
http://blog.unvs.cn/archives/2012_7.html

比方这些是调用的同一个模板生成的页面,但是又必须生成3个缓存,使用上面的语句肯定做不到,这里我们要想到一开始讲到的第二个可选参数cache_id,用一个缓存号,来区分同一个模板生成不同的页面及缓存,代码实例:

$cache_id = $_GET['id'];//url中的id参数值
$smarty->display('index.tpl', $cache_id);//将缓存号加入,即可完成?同一模板?不同参数?不同缓存 的功能;

到这里,有人发现,如果我的页面不止一个参数,那是不是得全部解析出来并做为缓存号?这里有一个更好的方法,推荐给大家,也是网上大多赞同的。(其实,上面一段是'废话',可去掉,但为了循序渐进,更好理解而写的过渡,谅)

推荐的方法是:你可以直接将整个当前URL获取下来,作为cache_id加入缓存,这样无论它多少个参数,都不会存在同一个缓存页,

代码实例:

$url=$_SERVER['REQUEST_URI'];//获取当前页URL,有的将url进行md5加密,亦可
$smarty->display('index.tpl', $url);

2、部分缓存方式

定义:意思就是,网站系统的部分页面进行缓存,而一些页面不进行缓存,比方网站的注册、登录处理页面可不进行缓存。

一种处理方式:在display()方法前或后面,将此模板缓存进行一次清除操作,注意保持两者参数必须一致;

代码实例:

$smarty->clear_cache("index.tpl");//此句放在display方法句前后都可以
$smarty->display("index.tpl");//与clear_cache方法参数必须一致

另一种处理方式:原理是一样的,因为部分缓存相当于两种情况,你可以另写一个display方法进行重构,其中一个参数判断是否进行缓存,若不,则进行clear_cache()方法处理,否则进行缓存;

代码实例:

function display($temp_name, $cache_id = null,$is_cache = true){
if($is_cache){
$smarty->clear_cache("index.tpl", $cache_id);
$smarty->display("index.tpl", $cache_id);//此两句不解,见上面绿色代码
}else{
$smarty->display("index.tpl", $cache_id);
}}

调用方法:

self::display($temp_name, $cache_id, false);
//这样设置即不进行缓存,有任何疑问可留言提出。

3、局部缓存方式

定义:一个页面,一些地方不进行缓存,保持动态更新,每次都加载,比如文章详细页的浏览次数、登录窗口框等。

有几种可实现局部缓存的方法(反面即处理好不缓存的地方就可实现局部缓存),着重讲解1、2种方法,我觉得就可以了,不用学会那么多。

a、使用SMarty引擎中内置的nocache函数,实现不缓存功能(smarty3.1.8版支持,不知smarty2+是否支持)

直接在tpl或html模板页中,不缓存区域加入{nocache}不缓存内容{/nocache}即可。
代码实例:

处理页面:$smarty->assign("time",time());

模板页面:{nocache}<{$time}>{/nocache}

b、注册块方法,实现不缓存

写一个no_cached方法,并调用smarty注册块函数将方法进行注册,即可实现,直接贴实例。

代码实例:

处理页面:$smarty->assign("time",time());

function no_cached($param, $content){//参数$param为块参数数组,参数$content为不缓存内容
return $content;
}
$smarty->register_block("no_cached", "no_cached", false);//注册块方法:register_block($tpl_func, $reg_func, $cacheable);//参数1为模板函数;参数2为需注册的函数即上面写的函数;参数3为是否进行缓存,这里必须设置为false

模板页面:{no_cached}<{$time}>{/no_cached}

c、当然还有其他一些方法,比如:注册函数等,这里就不介绍了,其中注册块详细使用,请查看smarty说明书,这里就不详述了。

4、缓存机制中的is_cached用法

最后,说下is_cached($temp_tpl[, $cache_id])判断是否已被缓存这个方法,$temp_tpl参数为模板页,$cache_id参数为缓存号,这个方法主要用在加载模板前进行缓存判断,若不存在就加载数据,若存在直接跳过,这样就达到了缓存的最终目的。

示例:

if(!smarty->is_cached('index.tpl')){//不存在缓存
//调用数据库,并对变量进行赋值
}
$smarty->display('index.tpl');//加载模板页

以上为Smarty的三种缓存

附:Smarty清除缓存方法

一、普通清除缓存方法

通过如下方法,对Smarty的缓存进行清除:

代码示例:

$smarty->clear_cache("index.tpl");//清除一个模板的缓存;
$smarty->clear_cache("index.tpl", $cache_Id);//清除一个带缓存编号的缓存;如:页面http://www.abc.com/index.asp?act=login,可以将$cache_id设为login;
$smarty->clear_all_cache();//清除所有缓存,即缓存目录下所有缓存文件;

这样就存在一个问题,比方网站有一个栏目:http://blog.unvs.cn/archives/php/,我只想清除这一个栏目的页面缓存而不想全部清除或一个页面缓存,这种情况经常会碰到,那么,接下来会讲到Smarty引擎中强大的缓存集合方法。

二、清除缓存集合方法

Smarty中文教程是这样描述的:可以通过建立cache_id集合做更详细的集合体,在cache_id集合里用竖线"|"来分开子集合。可以尽可能多的包含子集合。

上面解释的有点云里雾里,简单点说,就是在建立缓存中,将cache_id以一个带集合标识保存,用竖线隔开集合标识与缓存编号,而不仅仅是单一缓存编号,如:

$smarty->display("index.tpl", "category|".$cache_id);
//前面加了一个 category| 的前缀,表明将把缓存编号为$cache_id保存在category集合里,可以理解为分组;

这里添加一个缓存文件如何命名知识点,缓存文件命名生成规则:集合名称^_Site目录_页面名称_参数_页面名称编码md5加密

如下图所示:

Smarty缓存机制实例详解【三种缓存方式】

(category属于一个集合,index属于一个集合)

刚将了集合的生成,下面关键如何清除集合下的缓存,方法如下:

$smarty->clear_cache(null, "category");
//注意模板文件参数为null,""都不可以。

以上就完成了集合缓存的生成与清除,其实,网上也有这样一种方法:给一个栏目新建一个目录,比方news栏目,缓存生成放到一个news的缓存文件夹,这点不难,然后需要清除此栏目缓存时,缓存路径指向news即可。这个方法可行,个人觉得灵活性不高。

好了,关于Smarty缓存机制原理的讲解就完成了,当然这些只是实际开发常用的应用技巧,还有更多与缓存相关的函数、块什么的,不过掌握这些,相信Smarty缓存就可以运用自如了。

希望本文所述对大家基于smarty模板的PHP程序设计有所帮助。

PHP 相关文章推荐
php学习之变量的使用
May 29 PHP
PHP删除非空目录的函数代码小结
Feb 28 PHP
php制作unicode解码工具(unicode编码转换器)代码分享
Dec 24 PHP
PHP实现获取客户端IP并获取IP信息
Mar 17 PHP
php实现的简单日志写入函数
Mar 31 PHP
php实现QQ空间获取当前用户的用户名并生成图片
Jul 25 PHP
深入分析PHP优化及注意事项
Jul 04 PHP
PHP生成图像验证码的方法小结(2种方法)
Jul 18 PHP
PHP实现负载均衡session共享redis缓存操作示例
Aug 22 PHP
Laravel框架运行出错提示RuntimeException No application encryption key has been specified.解决方法
Apr 02 PHP
php传值和传引用的区别点总结
Nov 19 PHP
laravel通用化的CURD的实现
Dec 13 PHP
PHP INT类型在内存中占字节详解
Jul 20 #PHP
PHP检测一个数组有没有定义的方法步骤
Jul 20 #PHP
PHP defined()函数的使用图文详解
Jul 20 #PHP
php实现 master-worker 守护多进程模式的实例代码
Jul 20 #PHP
PHP抽象类和接口用法实例详解
Jul 20 #PHP
PHP使用PDO、mysqli扩展实现与数据库交互操作详解
Jul 20 #PHP
Smarty模板语法详解
Jul 20 #PHP
You might like
PHP 的 __FILE__ 常量
2007/01/15 PHP
PHP syntax error, unexpected $end 错误的一种原因及解决
2008/10/25 PHP
php中echo()和print()、require()和include()等易混淆函数的区别
2012/02/22 PHP
PHP错误处理函数
2016/04/03 PHP
PHP生成指定范围内的N个不重复的随机数
2019/03/18 PHP
一个基于jquery的图片切换效果
2010/07/06 Javascript
js中继承的几种用法总结(apply,call,prototype)
2013/12/26 Javascript
nodejs之请求路由概述
2014/07/05 NodeJs
Javascript正则控制文本框只能输入整数或浮点数
2014/09/02 Javascript
使用不同的方法结合/合并两个JS数组
2014/09/18 Javascript
jquery+php实现搜索框自动提示
2014/11/28 Javascript
javascript中Array()数组函数详解
2015/08/23 Javascript
基于jquery实现鼠标滚轮驱动的图片切换效果
2015/10/26 Javascript
安装使用Mongoose配合Node.js操作MongoDB的基础教程
2016/03/01 Javascript
JavaScript实现垂直向上无缝滚动特效代码
2016/11/23 Javascript
鼠标点击input,显示瞬间的边框颜色,对之修改与隐藏实例
2016/12/26 Javascript
详解vue-Resource(与后端数据交互)
2017/01/16 Javascript
浅谈Vue-cli单文件组件引入less,sass,css样式的不同方法
2018/03/13 Javascript
基于jQuery的时间戳与日期间的转化
2019/06/21 jQuery
Vue2.0实现简单分页及跳转效果
2019/07/29 Javascript
微信小程序授权登陆及每次检查是否授权实例代码
2019/09/18 Javascript
jquery+css3实现的经典弹出层效果示例
2020/05/16 jQuery
Python列表切片操作实例总结
2019/02/19 Python
python实现滑雪游戏
2020/02/22 Python
keras 如何保存最佳的训练模型
2020/05/25 Python
Python通过Schema实现数据验证方式
2020/11/12 Python
python基于pygame实现飞机大作战小游戏
2020/11/19 Python
浅谈HTML5新增及移除的元素
2016/06/27 HTML / CSS
德国最新街头服饰网上商店:BODYCHECK
2019/09/15 全球购物
分层教学实施方案
2014/03/19 职场文书
小摄影师教学反思
2014/04/27 职场文书
计算机应用专业毕业生求职信
2014/06/03 职场文书
个人学习党的群众路线教育实践活动心得体会
2014/11/05 职场文书
学校国庆节活动总结
2015/03/23 职场文书
党员学习型组织心得体会
2019/06/21 职场文书
MySQL中order by的使用详情
2021/11/17 MySQL