Smarty高级应用之缓存操作技巧分析


Posted in PHP onMay 14, 2016

本文实例讲述了Smarty高级应用之缓存操作技巧。分享给大家供大家参考,具体如下:

smarty缓存控制

smarty提供了强大的缓存功能。但有时我们并不希望整篇文档都被缓存,而是有选择的缓存某一部分内容或某一部分内容不被缓存。例如你在页面上端使用一个带有广告条位置的模板,广告条可以包含任何HTML、图象、FLASH等混合信息. 因此这里不能使用一个静态的链接,同时我们也不希望该广告条被缓存. 这就需要在 insert 函数指定,同时需要一个函数取广告条的内容信息。smarty也提供了这种缓存控制能力。

我们可以使用{insert}使模板的一部分不被缓存

可以使用$smarty->register_function($params,&$smarty)阻止插件从缓存中输出,

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

下面我们真对一个简单需求,分别说明这三种控制缓存输出的方法。

需求:被缓存的文档中当前时间不被缓存,随每次刷新而变化。

1、使用insert函数使模板的一部分不被缓存

index.tpl:

<div>{insert name="get_current_time"}</div>

index.php

function insert_get_current_time(){
  return date("Y-m-d H:m:s");
}
$smarty=new smarty();
$smarty->caching = true;
if(!$smarty->is_cached()){
  .......
}
$smarty->display('index.tpl');

注解:

定义一个函数,函数名格式为:

inser_name(array $params, object &$smarty),

函数参数可选的,如果在模板的insert方法中需要加入其他属性,就会作为数组传递给用户定义的函数。

如:

{insert name='get_current_time' local='zh'}

在get_current_time函数中我们就可以通过$params['local']来获得属性值。

如果在get_current_time函数中需要用到当前smarty对象的方法或属性,就可以通过第二个参数获得。

这时你会发现index.tpl已被缓存,但当前时间却随每次刷新在不断变化。

2、使用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}

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

3、使用register_block使整篇页面中的某一块不被缓存

index.tpl:

<div align='center'>
Page created: {"0"|date_format:"%D %H:%M:%S"}
{dynamic}
Now is: {"0"|date_format:"%D %H:%M:%S"}
... do other stuff ...
{/dynamic}
</div>

index.php:

function smarty_block_dynamic($param, $content, &$smarty) {
return $content;
}
$smarty = new Smarty;
$smarty->caching = true;
$smarty->register_block('dynamic', 'smarty_block_dynamic', false);
if(!$smarty->is_cached()){
  .......
}
$smarty->display('index.tpl');

注解:

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

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

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

4、总结

(1)对缓存的控制能力:

使用register_function和register_block能够方便的控制插件输出的缓冲能力,可以通过第三个参数控制是否缓存,默认是缓存的,需要我们显示设置为false,正如我们试验中的所做的那样

$smarty->register_function('current_time','smarty_function_current_time',false);

但insert函数默认是不缓存的。并且这个属性不能修改。从这个意义上讲insert函数对缓存的控制能力似乎不如register_function和register_block强。

(2)使用方便性:

但是insert函数使用非常方便。不用显示注册,只要在当前请求过程中包含这个函数smarty就会自动在当前请求的过程中查找指定的函数。

当然register_function也可以做到不在运行时显示注册。但是那样做的效果跟其他模版函数一样,统统被缓存,并且不能控制。

如果你使用在运行时显示调用register_function注册自定义函数,那么一定要在调用is_cached()方法前完成函数的注册工作。

否则在is_cached()这一步缓存文档将因为找不到注册函数而导致smarty错误

Smarty用户自定义函数实例

<?php
$smarty->register_function('date_now', 'print_current_date');
function print_current_date($params, &$smarty)
{
 if(empty($params['format'])) {
  $format = "%b %e, %Y";
 } else {
  $format = $params['format'];
 }
 return strftime($format,time());
}
?>

在模板中使用

{date_now}
{* or to format differently *}
{date_now format="%Y/%m/%d"}

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

PHP 相关文章推荐
常见的PHP五种设计模式小结
Mar 23 PHP
PHP 获取远程网页内容的代码(fopen,curl已测)
Jun 06 PHP
PHP 利用AJAX获取网页并输出的实现代码(Zjmainstay)
Aug 31 PHP
解决phpmyadmin中缺少mysqli扩展问题的方法
May 06 PHP
深入分析php之面向对象
May 15 PHP
PHP file_get_contents设置超时处理方法
Sep 30 PHP
php多种形式发送邮件(mail qmail邮件系统 phpmailer类)
Jan 22 PHP
详解PHP导入导出CSV文件
Nov 03 PHP
PHP内存缓存Memcached类实例
Dec 08 PHP
php实现批量删除挂马文件及批量替换页面内容完整实例
Jul 08 PHP
php reset() 函数指针指向数组中的第一个元素并输出实例代码
Nov 21 PHP
php封装的page分页类完整实例代码
Feb 01 PHP
php生成Android客户端扫描可登录的二维码
May 13 #PHP
php短信接口代码
May 13 #PHP
php实现在线通讯录功能(附源码)
May 13 #PHP
PHP将MySQL的查询结果转换为数组并用where拼接的示例
May 13 #PHP
php仿微信红包分配算法的实现方法
May 13 #PHP
PHP简单实现无限级分类的方法
May 13 #PHP
PHP生成可点击刷新的验证码简单示例
May 13 #PHP
You might like
FCKeditor的安装(PHP)
2007/01/13 PHP
PHP原理之异常机制深入分析
2010/08/08 PHP
php保存任意网络图片到服务器的方法
2015/04/14 PHP
php+ajax实现带进度条的上传图片功能【附demo源码下载】
2016/09/14 PHP
微信公众号开发之通过接口删除菜单
2017/02/20 PHP
php实现mysql连接池效果实现代码
2018/01/25 PHP
jquery简单的拖动效果实现原理及示例
2013/07/26 Javascript
Jquery右下角抖动、浮动 实例代码(兼容ie6、FF)
2013/08/15 Javascript
jQuery自定义事件的简单实现代码
2014/01/27 Javascript
使用jQuery不判断浏览器高度解决iframe自适应高度问题
2014/12/16 Javascript
使用requestAnimationFrame实现js动画性能好
2015/08/06 Javascript
如何利用JS通过身份证号获取当事人的生日、年龄、性别
2016/01/22 Javascript
AngularJS实现标签页的两种方式
2016/09/05 Javascript
JS中如何实现Laravel的route函数详解
2017/02/12 Javascript
给vue项目添加ESLint的详细步骤
2017/09/29 Javascript
Vue通过URL传参如何控制全局console.log的开关详解
2017/12/07 Javascript
浅谈ajax在jquery中的请求和servlet中的响应
2018/01/22 jQuery
CSS3 动画卡顿性能优化的完美解决方案
2018/09/20 Javascript
微信小程序实现自动定位功能
2018/10/31 Javascript
Vue.js特性Scoped Slots的浅析
2019/02/20 Javascript
基于javascript实现日历功能原理及代码实例
2020/05/07 Javascript
Javascript柯里化实现原理及作用解析
2020/10/22 Javascript
python安装twisted的问题解析
2018/08/21 Python
Python 实现两个服务器之间文件的上传方法
2019/02/13 Python
python 多线程串行和并行的实例
2019/02/22 Python
聪明的粉丝购买门票的地方:TickPick
2018/03/09 全球购物
英国领先的露营和露营车品牌之一:OLPRO
2019/08/06 全球购物
光荣入党自我鉴定
2014/01/22 职场文书
我爱我家教学反思
2014/05/01 职场文书
会计专业毕业生求职信
2014/07/04 职场文书
停课通知书
2015/04/24 职场文书
2015大学党建带团建工作总结
2015/07/23 职场文书
《作风建设永远在路上》心得体会
2016/01/21 职场文书
深入浅析Redis 集群伸缩原理
2021/05/15 Redis
nginx负载功能+nfs服务器功能解析
2022/02/28 Servers
vue实现Toast组件轻提示
2022/04/10 Vue.js