PHP模板引擎Smarty的缓存使用总结


Posted in PHP onApril 24, 2014

这里我们将分析一下如何开启和使用smarty缓存,如何清除smarty缓存以及smarty的全局缓存,部分缓存,局部缓存三种缓存机制。

一、开启和使用smarty缓存

要开启smarty的缓存,只需在smarty设置参数里面将caching设为true,并指定cache_dir即可。同时设置cache_lefetime参数指定缓存生存时间(单位为秒)。如果要对相同页面生成多个不同的缓存,可以在display或fetch中加入第二参数cache_id,如:

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

此特性可用于对不同的$_GET进行不同的缓存。

二、清除smarty缓存

清除smarty缓存一般有以下几种方式:

clear_all_cache();//清除所有缓存
clear_cache('index.tpl');//清除指定模板index.tpl的缓存
clear_cache('index.tpl',cache_id);//清除指定模板指定id的缓存

三、全局缓存

全局缓存就是为整个网站的全部页面都生成缓存页面。设置全局缓存首先我们要操作smarty的配置文件,开启缓存,指定缓存文件目录,并设置缓存的存活时间,设置参数如下:

$smarty->cache_dir='./cache/'; //设置存放缓存文件的文件夹
$smarty->caching=1;//开启缓存 0、FALSE代表关闭|非0数字、TRUE代表开启
$smarty->cache_lifetime=3600//单位为秒(如果填写-1为永不过期)

接下来我们要去具体的php页面设置与之对应的具体缓存文件的名字,在php页面中可按如下写法:

$smarty->display('list2.html',md5($_SERVER['REQUEST_URI']));//将当前页面的URL(包含?后面的所有参数)进行md5加密然后设置缓存文件名

需要注意的是:

$smarty->display('与之对应的模板文件名','缓存文件名的补充部分')这个方法。

第二个参数不是必须的,如果不写的话,缓存文件名就是模板文件名经过加密处理后的文件。但是这样会碰到一个比较棘手的问题,例如:

https://3water.com/article.php?id=5
https://3water.com/article.php?id=7

这两个个URL对应应该的不同的内容,但是生成的缓存文件名都是 article 加密后的结果。这就会导致用户想要查询的是不同的内容,访问的却是同一个缓存文件。所以建议加上一个辅助参数,将访问url(包含?后面的所有参数)md5加密是比较靠谱的一种做法。

四、部分缓存

部分缓存就是指定一些文件生成缓存文件,而非网站的全部文件。部分缓存的实质其实是部分不缓存,也就是说不是指定哪些文件生成缓存,而是指定具体一些文件不生成缓存。现在假设有3个文件:

https://3water.com/index.php //需要缓存
https://3water.com/cate.php //需要缓存
https://3water.com/article.php //不需要缓存

前面两个文件的php文件里面还是需要写上$smarty->display('与之对应的模板文件名','缓存文件名的补充部分')这句。

但在第三个文件中我们要特别指明不需要生成缓存,具体的方法是在display指定模板之前写上下面这段代码:

$smarty->clear_cache('与之对应的模板文件名');//其实写在$smarty->display('与之对应的模板文件名')之前还是之后都可以

当然$smarty->display('与之对应的模板文件名')还是要写,本来就不想生成缓存,第二个参数也就不需要了。

注意:$smarty->clear_cache()和$smarty->display()的参数一定要写成一致的

五、局部缓存

局部缓存就是指定同一页面下的某些局部地方生成缓存。其实它不是指定哪些局部生成缓存,而是哪些局部不生成缓存(这和部分缓存的操作思想是类似的)。我们先来看下面一个例子:

article.php 文件部分内容如下:

<?php
$time=time();
$smarty->assign('time',$lanmuarr);
function insert_timeget(){
return time();
}
$smarty->display('article.html');

对应模板文件article.html部分代码如下:

<body>
{$time}<!--开启缓存后,重复刷新这个值不会变-->
{insert name='timeget'}<!--开启缓存后,重复刷新这个值会变-->
</body>

这里对上面的例子做一下解释:在PHP中我们只要定义了函数名为 insert_ (注意下划线)自定义补充名的自定义函数,在其中返回的值,不需要assign()方法传递,就能直接在模板页面中以{insert name='自定义补充名'}的方式调用,同时不会受到缓存的影响,而实时刷新。

另外补充的一下是如果你感觉使用 Smarty 缓存不够爽的话,还可以使用自定义缓存,如何使用自定义缓存呢?

这里需要设置cache_handler_func使用自定义的函数处理缓存,如:

$smarty->cache_handler_func="myCache";
function myCache($action,&$smarty_obj,&$cache_content,$tpl_file=null,$cache_id=null,$compile_id=null){
switch($action){
case "read"://读取缓存内容
case "write"://写入缓存
case "clear"://清空
}
}

PHP 相关文章推荐
phpmyadmin MySQL 加密配置方法
Jul 05 PHP
通过JavaScript或PHP检测Android设备的代码
Mar 09 PHP
PHP简单实现断点续传下载的方法
Sep 25 PHP
深入浅析用PHP实现MVC
Mar 02 PHP
PHP递归实现层级树状展开
Apr 01 PHP
PHP生成图像验证码的方法小结(2种方法)
Jul 18 PHP
PHP目录与文件操作技巧总结(创建,删除,遍历,读写,修改等)
Sep 11 PHP
一个简单的php MVC留言本实例代码(必看篇)
Sep 22 PHP
实现PHP搜索加分页
Oct 12 PHP
php简单实现单态设计模式的方法分析
Jul 28 PHP
Ajax中的JSON格式与php传输过程全面解析
Nov 14 PHP
php实例化对象的实例方法
Nov 17 PHP
php smarty模板引擎的6个小技巧
Apr 24 #PHP
PHP中使用smarty生成静态文件的例子
Apr 24 #PHP
php过滤html中的其他网站链接的方法(域名白名单功能)
Apr 24 #PHP
php导出csv数据在浏览器中输出提供下载或保存到文件的示例
Apr 24 #PHP
smarty模板中使用get、post、request、cookies、session变量的方法
Apr 24 #PHP
php冒泡排序、快速排序、快速查找、二维数组去重实例分享
Apr 24 #PHP
php获取中文拼音首字母类和函数分享
Apr 24 #PHP
You might like
BBS(php &amp; mysql)完整版(二)
2006/10/09 PHP
vBulletin HACK----关于排版的两个HACK
2006/10/09 PHP
PHP与MySQL开发的8个技巧小结
2010/12/17 PHP
对text数据类型不支持代码页转换 从: 1252 到: 936
2011/04/23 PHP
php 数组动态添加实现代码(最土团购系统的价格排序)
2011/12/30 PHP
PHP中的gzcompress、gzdeflate、gzencode函数详解
2014/07/29 PHP
Yii2 rbac权限控制之菜单menu实例教程
2016/04/28 PHP
PHP生成可点击刷新的验证码简单示例
2016/05/13 PHP
JavaScript 对Cookie 操作的封装小结
2009/12/31 Javascript
JavaScript中的Array对象使用说明
2011/01/17 Javascript
Jquery中显示隐藏的实现代码分析
2011/07/26 Javascript
Javascript中this的用法详解
2014/09/22 Javascript
jquery实现根据浏览器窗口大小自动缩放图片的方法
2015/07/17 Javascript
详解Angularjs中的依赖注入
2016/03/11 Javascript
BootStrap使用popover插件实现鼠标经过显示并保持显示框
2016/06/23 Javascript
详解如何实现一个简单的Node.js脚手架
2017/12/04 Javascript
Router解决跨模块下的页面跳转示例
2018/01/11 Javascript
微信小程序调用天气接口并且渲染在页面过程详解
2019/06/24 Javascript
js实现盒子移动动画效果
2020/08/09 Javascript
[01:36:17]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第一场 1月31日
2021/03/11 DOTA
Python内置函数dir详解
2015/04/14 Python
Phantomjs抓取渲染JS后的网页(Python代码)
2016/05/13 Python
Python实现批量读取图片并存入mongodb数据库的方法示例
2018/04/02 Python
Django模板语言 Tags使用详解
2019/09/09 Python
Python生成随机验证码代码实例解析
2020/06/09 Python
Pycharm 如何一键加引号的方法步骤
2021/02/05 Python
皇家道尔顿官网:Royal Doulton
2017/12/06 全球购物
SISLEY希思黎官方旗舰店:享誉全球的奢华植物美容品牌
2018/04/25 全球购物
俄罗斯设计师家具购物网站:The Furnish
2019/12/01 全球购物
《奇妙的国际互联网》 教学反思
2014/02/25 职场文书
银行优秀员工事迹材料
2014/05/29 职场文书
少先队活动总结
2014/08/29 职场文书
六查六看心得体会
2014/10/14 职场文书
2015年保洁工作总结范文
2015/04/28 职场文书
2015年高二班主任工作总结
2015/05/25 职场文书
MySQL创建管理RANGE分区
2022/04/13 MySQL