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 相关文章推荐
服务器端解压缩zip的脚本
Dec 22 PHP
mysqli_set_charset和SET NAMES使用抉择及优劣分析
Jan 13 PHP
php 获取SWF动画截图示例代码
Feb 10 PHP
php 字符串中的\n换行符无效、不能换行的解决方法
Apr 02 PHP
安装ImageMagick出现error while loading shared libraries的解决方法
Sep 23 PHP
php递归调用删除数组空值元素的方法
Apr 28 PHP
php实现的日历程序
Jun 18 PHP
PHP编程中尝试程序并发的几种方式总结
Mar 21 PHP
YII动态模型(动态表名)支持分析
Mar 29 PHP
php+MySQL实现登录时验证登录名和密码是否正确
May 10 PHP
php使用变量动态创建类的对象用法示例
Feb 06 PHP
PHP设计模式之单例模式定义与用法分析
Mar 26 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
CPU步进是什么意思?i3-9100F B0步进和U0步进区别知识科普
2020/03/17 数码科技
PHP目录函数实现创建、读取目录教程实例
2011/01/13 PHP
PHP+Mysql+jQuery查询和列表框选择操作实例讲解
2015/10/22 PHP
PHP回调函数与匿名函数实例详解
2017/08/16 PHP
PHP排序算法之快速排序(Quick Sort)及其优化算法详解
2018/04/21 PHP
php转换上传word文件为PDF的方法【基于COM组件】
2019/06/10 PHP
Laravel 实现添加多语言提示信息
2019/10/25 PHP
避免回车键导致的页面无意义刷新的解决方法
2011/04/12 Javascript
JavaScript事件委托的技术原理探讨示例
2014/04/17 Javascript
JavaScript中的逻辑判断符&amp;&amp;、||与!介绍
2014/12/31 Javascript
jQuery超精致图片轮播幻灯片特效代码分享
2015/09/10 Javascript
Function.prototype.apply()与Function.prototype.call()小结
2016/04/27 Javascript
js获取Html元素的实际宽度高度的方法
2016/05/19 Javascript
vue js秒转天数小时分钟秒的实例代码
2018/08/08 Javascript
小程序异步问题之多个网络请求依次执行并依次收集请求结果
2019/05/05 Javascript
详解Vue中Axios封装API接口的思路及方法
2020/10/10 Javascript
JavaScript大数相加相乘的实现方法实例
2020/10/18 Javascript
Python编程中NotImplementedError的使用方法
2018/04/21 Python
使用Python进行QQ批量登录的实例代码
2018/06/11 Python
python实现字符串中字符分类及个数统计
2018/09/28 Python
解决安装pycharm后不能执行python脚本的问题
2019/01/19 Python
Opencv-Python图像透视变换cv2.warpPerspective的示例
2019/04/11 Python
pytorch 自定义卷积核进行卷积操作方式
2019/12/30 Python
python对象销毁实例(垃圾回收)
2020/01/16 Python
如何使用Python自动生成报表并以邮件发送
2020/10/15 Python
python 利用toapi库自动生成api
2020/10/19 Python
python之openpyxl模块的安装和基本用法(excel管理)
2021/02/03 Python
解决pycharm不能自动保存在远程linux中的问题
2021/02/06 Python
一款利用html5和css3实现的3D滚动特效的教程
2015/01/04 HTML / CSS
家乐福巴西网上超市:Carrefour巴西
2016/10/31 全球购物
台湾SHOPRO购物行家:亚洲首创影视.3C.家电.优质购物平台
2018/05/07 全球购物
飘柔洗发水广告词
2014/03/14 职场文书
法人授权委托书样本
2014/09/19 职场文书
分居协议书范本
2014/11/03 职场文书
学前班语言教学计划
2015/01/20 职场文书
父亲节活动总结
2015/02/12 职场文书