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 相关文章推荐
我的论坛源代码(七)
Oct 09 PHP
快速配置PHPMyAdmin方法
Jun 05 PHP
PHP调用MySQL的存储过程的实现代码
Aug 12 PHP
php 执行系统命令的方法
Jul 07 PHP
php实现mysql同步的实现方法
Oct 21 PHP
通过5个php实例细致说明传值与传引用的区别
Aug 08 PHP
PHP基础之运算符的使用方法
Apr 28 PHP
PHP异常Parse error: syntax error, unexpected T_VAR错误解决方法
May 06 PHP
PHP has encountered a Stack overflow问题解决方法
Nov 03 PHP
学习php设计模式 php实现合成模式(composite)
Dec 08 PHP
php将print_r处理后的数据还原为原始数组的解决方法
Nov 02 PHP
php实现基于pdo的事务处理方法示例
Jul 21 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
iis下php mail函数的sendmail配置方法(官方推荐)
2012/04/25 PHP
zend Framework中的Layout(模块化得布局)详解
2013/06/28 PHP
php中fsockopen用法实例
2015/01/05 PHP
PHP调试的强悍利器之PHPDBG
2016/02/22 PHP
PHP未登录自动跳转到登录页面
2016/12/21 PHP
Yii框架扩展CGridView增加导出CSV功能的方法
2017/05/24 PHP
PHP实现的回溯算法示例
2017/08/15 PHP
关于js日期转化为毫秒数“节省20%的效率和和节省9个字符“问题
2012/03/01 Javascript
jQuery实现鼠标点击弹出渐变层的方法
2015/07/09 Javascript
JS打字效果的动态菜单代码分享
2015/08/21 Javascript
javascript模拟C#格式化字符串
2015/08/26 Javascript
jQuery使用$.ajax进行即时验证的方法
2015/12/08 Javascript
jQuery实现的跨容器无缝拖动效果代码
2016/06/21 Javascript
JavaScript使用链式方法封装jQuery中CSS()方法示例
2017/04/07 jQuery
js保留两位小数方法总结
2018/01/31 Javascript
vue实现提示保存后退出的方法
2018/03/15 Javascript
Vue的状态管理vuex使用方法详解
2020/02/05 Javascript
js实现百度登录窗口拖拽效果
2020/03/19 Javascript
[01:33:30]DOTA2-DPC中国联赛 正赛 RNG vs Phoenix BO3 第二场 2月5日
2021/03/11 DOTA
Python中一行和多行import模块问题
2018/04/01 Python
python验证码识别教程之利用滴水算法分割图片
2018/06/05 Python
Django后端接收嵌套Json数据及解析详解
2019/07/17 Python
jupyter notebook的安装与使用详解
2020/05/18 Python
python写文件时覆盖原来的实例方法
2020/07/22 Python
python os.listdir()乱码解决方案
2021/01/31 Python
基于IE10/HTML5 开发
2013/04/22 HTML / CSS
Speedo速比涛德国官方网站:世界领先的泳装品牌
2019/08/26 全球购物
什么是索引指示器
2012/08/20 面试题
创意活动策划书
2014/01/15 职场文书
数学教学随笔感言
2014/02/17 职场文书
秘书英文求职信
2014/04/16 职场文书
司法局群众路线教育实践活动整改措施
2014/09/17 职场文书
毕业横幅标语
2014/10/08 职场文书
实习证明模板
2015/06/16 职场文书
小学生组织委员竞选稿
2015/11/21 职场文书
PC版《死亡搁浅导剪版》现已发售 展开全新的探险
2022/04/03 其他游戏