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同时支持GIF、png、JPEG
Oct 09 PHP
php empty() 检查一个变量是否为空
Nov 10 PHP
Zend Studio 实用快捷键一览表(精心整理)
Aug 10 PHP
php读取csv文件后,uft8 bom导致在页面上显示出现问题的解决方法
Aug 10 PHP
PHP实现根据设备类型自动跳转相应页面的方法
Jul 24 PHP
php内存缓存实现方法
Jan 24 PHP
php浏览历史记录的方法
Mar 10 PHP
php根据一个给定范围和步进生成数组的方法
Jun 19 PHP
php实现网站顶踩功能的完整前端代码
Jul 19 PHP
Zend Framework入门教程之Zend_Session会话操作详解
Dec 08 PHP
PHP Class SoapClient not found解决方法
Jan 20 PHP
laravel 根据不同组织加载不同视图的实现
Oct 14 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
PHP+MYSQL开发工具及资源收藏
2007/01/02 PHP
php下过滤html代码的函数 提高程序安全性
2010/03/02 PHP
php下foreach提示Warning:Invalid argument supplied for foreach()的解决方法
2014/11/11 PHP
php读取flash文件高宽帧数背景颜色的方法
2015/01/06 PHP
php短址转换实现方法
2015/02/25 PHP
Symfony2安装第三方Bundles实例详解
2016/02/04 PHP
老生常谈ThinkPHP中的行为扩展和插件(推荐)
2017/05/05 PHP
javascript实现十六进制颜色值(HEX)和RGB格式相互转换
2014/06/20 Javascript
JavaScript数组方法大全(推荐)
2016/07/05 Javascript
jQuery实现的图片轮播效果完整示例
2016/09/12 Javascript
JavaScript正则表达式替换字符串中图片地址(img src)的方法
2017/01/13 Javascript
jQuery插件FusionWidgets实现的AngularGauge图效果示例【附demo源码】
2017/03/23 jQuery
JS排序之选择排序详解
2017/04/08 Javascript
详解webpack分离css单独打包
2017/06/21 Javascript
20行JS代码实现网页刮刮乐效果
2017/06/23 Javascript
React中的refs的使用教程
2018/02/13 Javascript
详解微信小程序input标签正则初体验
2018/08/18 Javascript
新手必须知的Node.js 4个JavaScript基本概念
2018/09/16 Javascript
JavaScript函数定义方法实例详解
2019/03/05 Javascript
Python使用Matplotlib模块时坐标轴标题中文及各种特殊符号显示方法
2018/05/04 Python
Python3安装Pillow与PIL的方法
2019/04/03 Python
详解用python -m http.server搭一个简易的本地局域网
2020/09/24 Python
Python中return函数返回值实例用法
2020/11/19 Python
使用CSS3配合IE滤镜实现渐变和投影的效果
2015/09/06 HTML / CSS
CSS3条纹背景制作的实战攻略
2016/05/31 HTML / CSS
日本一家专门经营各种箱包的大型网站:Traveler Store
2016/08/03 全球购物
美国成衣女装品牌:CHICO’S
2016/09/19 全球购物
塔吉特百货公司官网:Target
2017/04/27 全球购物
纽约手袋品牌:KARA
2018/03/18 全球购物
教师自我鉴定范文
2014/03/20 职场文书
婚纱摄影师求职信范文
2014/04/17 职场文书
大学奖学金获奖感言
2014/08/15 职场文书
领导班子民主生活会整改措施(工商局)
2014/09/21 职场文书
Apache压力测试工具的安装使用
2021/03/31 Servers
浅谈Python数学建模之整数规划
2021/06/23 Python
MySQL批量更新不同表中的数据
2022/05/11 MySQL