Smarty模板引擎缓存机制详解


Posted in PHP onMay 23, 2016

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

首先说下smarty缓存和编译,这是两个不同的概念,编译默认情况下是启动的,而缓存机制需要人为开启,smarty编译过的文件还是php文件,所以执行的时候还是编译的,如果涉及到数据库,还是要访问数据库的所以开销也不小啦,所以需要smarty缓存来解决!

1.开启全局缓存

$smarty->cache_dir = "/caches/"; //缓存目录
$smarty->caching = true; //开启缓存,为flase的时侯缓存无效
$smarty->cache_lifetime = 3600; //缓存时间

2.一个页面使用多个缓存

如:一个文章模板页面会生成多个文章页面,当然是缓存成很多页面,实现起来很简单,只要在display()方法设置第二个参数,指定唯一标识符即可。如下php代码:

$smarty->display('index.tpl',$_GET["article_id"]);

如上,通过第二个参数文章的id缓存一个文章页面。

3.为缓存减小开销

也就是说,已经缓存的页面无需进行数据库的操作处理了,可通过is_cached()方法判断!

if(!$smarty->is_cached('index.tpl')){
 //调用数据库
}
$smarty->display('index.tpl');

4.清除缓存

一般在开发过程中是不开启缓存的,因为在缓存时间内输出结果不变,但是在应用过程中开启缓存能大大提高web性能,清除缓存方法如下:

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

5.关闭局部缓存

如果一个页面中一部分缓存,而另一部分不需要缓存,就可以这样做,比如说显示用户登录的名称就需要关闭缓存,smarty提供了如下三种解决方法:

(1)使用insert模板的一部分不被缓存

定义一个inser标签要使用的处理函数,函数名格式为:insert_xx(array $params, object &$smarty)其中的xx是insert的name,也就是说,如果你定义的函数为insert_abc,则模板中使用方法为{insert name=abc}

参数通过$params传入

也可以做成insert插件,文件名命名为:insert.xx.php,函数命名为:smarty_insert_aa($params,&$smarty),xx定义同上

(2)$smarty->register_block($params, &$smarty)使整篇页面中的某一块不被缓存

定义一个block:

smarty_block_name($params,$content, &$smarty){return $content;} 
//name表示区域名

注册block:

$smarty->register_block(name, smarty_block_name, false);
//第三参数false表示该区域不被缓存

模板写法:

{name}内容 {/name}

写成block插件:

第一步:定义一件插件函数:block.cacheless.php,放在smarty的 plugins目录

block.cacheless.php的内容如下:

<?php
function smarty_block_cacheless($param, $content, &$smarty) {
return $content;
}
?>

第二步:编写程序及模板

示例程序:testCacheLess.php

<?php
include(Smarty.class.php);
$smarty = new Smarty;
$smarty->caching=true;
$smarty->cache_lifetime = 6;
$smarty->display(cache.tpl);
?>

所用的模板:cache.tpl

已经缓存的:{$smarty.now}<br>
{cacheless}
没有缓存的:{$smarty.now}
{/cacheless}

现在运行一下,发现是不起作用的,两行内容都被缓存了

第三步:改写Smarty_Compiler.class.php(注:该文件很重要,请先备份,以在必要时恢复)

查找:

$this->_plugins[block][$tag_command] = array($plugin_func, null, null, null, true);

修改成:

if($tag_command == cacheless) $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);

你也可以直接将原句的最后一个参数改成false,即关闭默认缓存。

(3)使用register_function阻止插件从缓存中输出

index.tpl:

<div>{current_time}{/div}
index.php:
function smarty_function_current_time($params, &$smarty){
  return date("Y-m-d H:m:s");
}
$smarty=new smarty();
$smarty->caching = true;
$smarty->register_function('current_time','smarty_function_current_time',false);
if(!$smarty->is_cached()){
  .......
}
$smarty->display('index.tpl');

注解:

定义一个函数,函数名格式为:smarty_type_name($params, &$smarty)
type为function

name为用户自定义标签名称,在这里是{current_time}

两个参数是必须的,即使在函数中没有使用也要写上。两个参数的功能同上。

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

PHP 相关文章推荐
php 不使用js实现页面跳转
Feb 11 PHP
php生成静态页面的简单示例
Apr 17 PHP
PHP实现自动登入google play下载app report的方法
Sep 23 PHP
php页面函数设置超时限制的方法
Dec 01 PHP
PHP使用header()输出图片缓存实例
Dec 09 PHP
php提取身份证号码中的生日日期以及验证是否为成年人的函数
Sep 29 PHP
YII2框架中excel表格导出的方法详解
Jul 21 PHP
PHP运用foreach神奇的转换数组(实例讲解)
Feb 01 PHP
PHPTree――php快速生成无限级分类
Mar 30 PHP
php curl获取到json对象并转成数组array的方法
May 31 PHP
针对thinkPHP5框架存储过程bug重写的存储过程扩展类完整实例
Jun 16 PHP
PHP数组Key强制类型转换实现原理解析
Sep 01 PHP
Yii2分页的使用及其扩展方法详解
May 23 #PHP
CI框架扩展系统核心类的方法分析
May 23 #PHP
PHP strip_tags保留多个HTML标签的方法
May 22 #PHP
项目中应用Redis+Php的场景
May 22 #PHP
Yii2.0 模态弹出框+ajax提交表单
May 22 #PHP
php文件上传后端处理小技巧
May 22 #PHP
PHP strip_tags() 去字符串中的 HTML、XML 以及 PHP 标签的函数
May 22 #PHP
You might like
PHP中is_dir()函数使用指南
2015/05/08 PHP
PHP实现简单爬虫的方法
2015/07/29 PHP
使用PHP实现微信摇一摇周边红包
2016/01/04 PHP
基于ThinkPHP5.0实现图片上传插件
2017/09/25 PHP
Laravel框架搜索分页功能示例
2019/02/01 PHP
js split 的用法和定义 js split分割字符串成数组的实例代码
2012/05/13 Javascript
js利用prototype调用Array的slice方法示例
2014/06/09 Javascript
JS实用的动画弹出层效果实例
2015/05/05 Javascript
基于jquery fly插件实现加入购物车抛物线动画效果
2016/04/05 Javascript
jQuery中iframe的操作(点击按钮新增窗口)
2016/04/20 Javascript
AngularJS删除路由中的#符号的方法
2016/09/20 Javascript
如何让你的JS代码更好看易读
2017/12/01 Javascript
微信小程序实现滚动消息通知
2018/02/02 Javascript
JavaScript 俄罗斯方块游戏实现方法与代码解释
2020/04/08 Javascript
vue基础知识--axios合并请求和slot
2020/06/04 Javascript
python使用正则表达式的search()函数实现指定位置搜索功能
2017/11/10 Python
Selenium 模拟浏览器动态加载页面的实现方法
2018/05/16 Python
Django读取Mysql数据并显示在前端的实例
2018/05/27 Python
Python计算时间间隔(精确到微妙)的代码实例
2019/02/26 Python
Python内置类型性能分析过程实例
2020/01/29 Python
Django的CVB实例详解
2020/02/10 Python
详解Python流程控制语句
2020/10/28 Python
html5设计原理(推荐收藏)
2014/05/17 HTML / CSS
用HTML5中的Canvas结合公式绘制粒子运动的教程
2015/05/08 HTML / CSS
国外平面设计第一市场:99designs
2016/10/25 全球购物
JD Sports瑞典:英国领先的运动时尚商店
2018/01/28 全球购物
暑假实习求职信范文
2013/09/22 职场文书
电大物流学生的自我评价
2013/10/25 职场文书
微型企业创业投资计划书
2014/01/10 职场文书
项目投资建议书
2014/05/16 职场文书
2014年师德师风学习材料
2014/05/16 职场文书
党委书记个人对照检查材料
2014/09/15 职场文书
2015年机关党建工作总结
2015/05/22 职场文书
母亲节感言
2015/08/03 职场文书
党员反腐倡廉学习心得体会
2015/08/15 职场文书
MySQL中存储时间的最佳实践指南
2021/07/01 MySQL