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批量生成缩略图的代码
Jul 19 PHP
php如何解决无法上传大于8M的文件问题
Mar 10 PHP
ThinkPHP控制器间实现相互调用的方法
Oct 31 PHP
在Windows系统下使用PHP生成Word文档的教程
Jul 03 PHP
详解php的socket通信
Aug 11 PHP
在Mac OS上自行编译安装Apache服务器和PHP解释器
Dec 24 PHP
PHP图形操作之Jpgraph学习笔记
Dec 25 PHP
CodeIgniter配置之database.php用法实例分析
Jan 20 PHP
PHP laravel中的多对多关系实例详解
Jun 07 PHP
PDO::query讲解
Jan 29 PHP
Thinkphp5框架实现图片、音频和视频文件的上传功能详解
Aug 27 PHP
PHP实现微信公众号验证Token的示例代码
Dec 16 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打造智能化的柱状图程序,用于报表等
2015/06/19 PHP
PHP+Ajax实现无刷新分页实例详解(附demo源码下载)
2016/04/07 PHP
PHP面向对象程序设计内置标准类,普通数据类型转为对象类型示例
2019/06/12 PHP
jQuery 判断页面元素是否存在的代码
2009/08/14 Javascript
URL地址中的#符号使用说明
2011/02/12 Javascript
jquery操作checkbox实现全选和取消全选
2014/05/02 Javascript
原生js与jQuery实现简单的tab切换特效对比
2015/07/30 Javascript
Nginx上传文件全部缓存解决方案
2015/08/17 Javascript
javascript嵌套函数和在函数内调用外部函数的区别分析
2016/01/31 Javascript
AngularJS下对数组的对比分析
2016/08/24 Javascript
javascript学习笔记_浅谈基础语法,类型,变量
2016/09/19 Javascript
JS双击变input框批量修改内容
2016/12/12 Javascript
JavaScript实现的冒泡排序法及统计相邻数交换次数示例
2017/04/26 Javascript
详解angularjs中的隔离作用域理解以及绑定策略
2017/05/31 Javascript
vue教程之toast弹框全局调用示例详解
2020/08/24 Javascript
Vue.js实现双向数据绑定方法(表单自动赋值、表单自动取值)
2018/08/27 Javascript
Vue循环组件加validate多表单验证的实例
2018/09/18 Javascript
JS判断数组里是否有重复元素的方法小结
2019/05/21 Javascript
解决webpack多页面内存溢出的方法示例
2019/10/08 Javascript
element的el-table中记录滚动条位置的示例代码
2019/11/06 Javascript
python的变量与赋值详细分析
2017/11/08 Python
python按行读取文件并找出其中指定字符串
2019/08/08 Python
Django models filter筛选条件详解
2020/03/16 Python
python实现梯度下降法
2020/03/24 Python
Python3操作YAML文件格式方法解析
2020/04/10 Python
Pycharm安装python库的方法
2020/11/24 Python
加拿大最大的体育用品、鞋类和服装零售商:Sport Chek
2018/11/29 全球购物
美国厨房和园艺工具网上商店:Nestneed
2019/08/24 全球购物
意大利时尚精品店:Nugnes 1920
2020/02/10 全球购物
德国消费电子产品购物网站:Guter Kauf
2020/09/15 全球购物
C#中类(class)与结构(struct)的异同
2013/11/03 面试题
售后服务科岗位职责范文
2013/11/13 职场文书
高二英语教学反思
2016/03/03 职场文书
《蓝鲸的眼睛》读后感5篇
2020/01/15 职场文书
Golang之sync.Pool使用详解
2021/05/06 Golang
go语言使用Casbin实现角色的权限控制
2021/06/26 Golang