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+Html+缓存
Dec 20 PHP
PHP 配置open_basedir 让各虚拟站点独立运行
Nov 12 PHP
php中使用explode查找某个字符是否存在的方法
Jul 12 PHP
PHP If Else(elsefi) 语句
Apr 07 PHP
基于wordpress主题制作的具体实现步骤
May 10 PHP
使用php检测用户当前使用的浏览器是否为IE浏览器
Dec 03 PHP
Yii实现多按钮保存与提交的方法
Dec 03 PHP
PHP导出Excel实例讲解
Jan 24 PHP
php结合mysql与mysqli扩展处理事务的方法
Jun 29 PHP
php使用Jpgraph创建折线图效果示例
Feb 15 PHP
Laravel框架生命周期与原理分析
Jun 12 PHP
PHP ElasticSearch做搜索实例讲解
Feb 05 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程序员的13个好习惯小结
2012/02/20 PHP
php生成图形验证码几种方法小结
2013/08/15 PHP
yii2分页之实现跳转到具体某页的实例代码
2016/06/02 PHP
laravel框架使用极光推送消息操作示例
2020/02/15 PHP
用javascript实现的仿Flash广告图片轮换效果
2007/04/24 Javascript
javascript 自定义事件初探
2009/08/21 Javascript
javascript常用对话框小集
2013/09/13 Javascript
jQuery网页选项卡插件rTabs用法实例分析
2015/08/26 Javascript
前端性能优化及技巧
2016/05/06 Javascript
javascript实现随机生成DIV背景色
2016/06/20 Javascript
Bootstrap时间选择器datetimepicker和daterangepicker使用实例解析
2016/09/17 Javascript
jQuery动态添加与删除tr行实例代码
2016/10/18 Javascript
js自定义QQ菜单效果
2017/01/10 Javascript
Vue input控件通过value绑定动态属性及修饰符的方法
2017/05/03 Javascript
详解angular笔记路由之angular-router
2017/09/12 Javascript
jQuery与vue实现拖动验证码功能
2018/01/30 jQuery
ES6 迭代器(Iterator)和 for.of循环使用方法学习(总结)
2018/02/08 Javascript
Vue cli构建及项目打包以及出现的问题解决
2018/08/27 Javascript
vue3.0 CLI - 3.2 路由的初级使用教程
2018/09/20 Javascript
vue多个元素的样式选择器问题
2019/11/29 Javascript
使用webpack搭建pixi.js开发环境
2020/02/12 Javascript
Taro小程序自定义顶部导航栏功能的实现
2020/12/17 Javascript
[03:59]5分钟带你了解什么是DOTA2(第二期)
2017/02/07 DOTA
python抓取豆瓣图片并自动保存示例学习
2014/01/10 Python
Python实现的中国剩余定理算法示例
2017/08/05 Python
Python实现求两个csv文件交集的方法
2017/09/06 Python
Python判断两个对象相等的原理
2017/12/12 Python
深入浅析python 中的匿名函数
2018/05/21 Python
Python 中的 import 机制之实现远程导入模块
2019/10/29 Python
使用Django xadmin 实现修改时间选择器为不可输入状态
2020/03/30 Python
轻松掌握CSS3中的字体大小单位rem的使用方法
2016/05/24 HTML / CSS
写演讲稿要注意的六件事
2014/01/14 职场文书
一年级学生评语
2014/04/23 职场文书
学校光盘行动倡议书
2015/04/28 职场文书
z-index不起作用
2021/03/31 HTML / CSS
TV动画《史上最强大魔王转生为村民A》番宣CM公布
2022/04/01 日漫