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 相关文章推荐
10个可以简化php开发过程的MySQL工具
Apr 11 PHP
php中取得URL的根域名的代码
Mar 23 PHP
PHP设计模式之解释器模式的深入解析
Jun 13 PHP
php include和require的区别深入解析
Jun 17 PHP
PHP将进程作为守护进程的方法
Mar 19 PHP
php抽象类用法实例分析
Jul 07 PHP
PHP实现通过get方式识别用户发送邮件的方法
Jul 16 PHP
通过Email发送PHP错误的方法
Jul 20 PHP
PHP加密解密实例分析
Dec 25 PHP
Symfony2开发之控制器用法实例分析
Feb 05 PHP
php实现用户注册密码的crypt加密
Jun 08 PHP
laravel 框架配置404等异常页面
Jan 07 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 删除记录实现代码
2009/03/12 PHP
apache配置虚拟主机的方法详解
2013/06/17 PHP
php实现用于删除整个目录的递归函数
2015/03/16 PHP
简单理解PHP的面向对象编程方式
2016/05/17 PHP
PHPWind9.0手动屏蔽验证码解决后台关闭验证码但是依然显示的问题
2016/08/12 PHP
php解决安全问题的方法实例
2019/09/19 PHP
JS不间断向上滚动效果代码
2013/12/25 Javascript
js实现图片拖动改变顺序附图
2014/05/13 Javascript
jQuery中contents()方法用法实例
2015/01/08 Javascript
JavaScript中使用Math.PI圆周率属性的方法
2015/06/14 Javascript
Javascript闭包实例详解
2015/11/29 Javascript
JS简单实现DIV相对于浏览器固定位置不变的方法
2016/06/17 Javascript
JS实现关闭当前页而不弹出提示框的方法
2016/06/22 Javascript
js设置文字颜色的方法示例
2016/12/30 Javascript
用jQuery实现优酷首页轮播图
2017/01/09 Javascript
前端主流框架vue学习笔记第二篇
2017/07/26 Javascript
Vue.js结合bootstrap前端实现分页和排序效果
2018/12/29 Javascript
JS使用cookie保存用户登录信息操作示例
2019/05/30 Javascript
Layui带搜索的下拉框的使用以及动态数据绑定方法
2019/09/28 Javascript
[04:22]DSPL第二期精彩集锦:残血反杀!
2014/12/10 DOTA
qpython3 读取安卓lastpass Cookies
2016/06/19 Python
Python常用内置模块之xml模块(详解)
2017/05/23 Python
把django中admin后台界面的英文修改为中文显示的方法
2019/07/26 Python
基于matplotlib xticks用法详解
2020/04/16 Python
jupyter使用自动补全和切换默认浏览器的方法
2020/11/18 Python
Clarks西班牙官方在线商店:clarks鞋
2019/05/03 全球购物
密封类可以有虚函数吗
2014/08/11 面试题
C#和SQL Server的面试题
2016/08/12 面试题
大学毕业生通用自荐信范文
2013/10/31 职场文书
护理个人求职信范文
2014/01/08 职场文书
疾病捐款倡议书
2014/05/13 职场文书
企业诚信承诺书
2014/05/23 职场文书
2015年学习部工作总结范文
2015/03/31 职场文书
停电调休通知
2015/04/16 职场文书
辩护词格式
2015/05/22 职场文书
高中生物教学反思
2016/02/20 职场文书