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 防恶意刷新实现代码
May 16 PHP
关于php mvc开发模式的感想
Jun 28 PHP
PHP 杂谈《重构-改善既有代码的设计》之一 重新组织你的函数
Apr 09 PHP
php使用Jpgraph绘制饼状图的方法
Jun 10 PHP
PHP识别二维码的方法(php-zbarcode安装与使用)
Jul 07 PHP
Laravel日志用法详解
Oct 09 PHP
DEDE实现转跳属性文档在模板上调用出转跳地址
Nov 04 PHP
浅谈PHP的数据库接口和技术
Dec 09 PHP
thinkPHP3.2.3实现阿里大于短信验证的方法
Jun 06 PHP
PHP检查端口是否可以被绑定的方法示例
Aug 09 PHP
thinkphp框架无限级栏目的排序功能实现方法示例
Mar 29 PHP
PHP设计模式(九)外观模式Facade实例详解【结构型】
May 02 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获取文件绝对路径的代码(上一级目录)
2011/05/29 PHP
PHP递归调用数组值并用其执行指定函数的方法
2015/04/01 PHP
PHP实现批量删除(封装)
2017/04/28 PHP
php使用curl伪造来源ip和refer的方法示例
2018/05/08 PHP
WordPress JQuery处理沙发头像
2009/06/22 Javascript
DOM操作一些常用的属性汇总
2015/03/13 Javascript
JavaScript检测鼠标移动方向的方法
2015/05/22 Javascript
JavaScript操作Cookie方法实例分析
2015/05/27 Javascript
js鼠标点击图片切换效果代码分享
2015/08/26 Javascript
jQuery-1.9.1源码分析系列(十)事件系统之事件包装
2015/11/20 Javascript
使用Web Uploader实现多文件上传
2016/06/08 Javascript
你不需要jQuery(三) 新AJAX方法fetch()
2016/06/14 Javascript
angularjs 源码解析之injector
2016/08/22 Javascript
bootstrap 模态框(modal)实现水平垂直居中显示
2017/01/23 Javascript
ES6中Math对象的部分扩展
2017/02/20 Javascript
详解微信JS-SDK选择图片遇到的坑
2018/08/15 Javascript
JS基于Location实现访问Url、重定向及刷新页面的方法分析
2018/12/03 Javascript
微信小程序开发实现的选项卡(窗口顶部/底部TabBar)页面切换功能图文详解
2019/05/14 Javascript
vue elementui tree 任意级别拖拽功能代码
2020/08/31 Javascript
[51:29]Alliance vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
Python实现SMTP发送邮件详细教程
2021/03/02 Python
python 去除txt文本中的空格、数字、特定字母等方法
2018/07/24 Python
python3应用windows api对后台程序窗口及桌面截图并保存的方法
2019/08/27 Python
Python对接 xray 和微信实现自动告警
2019/09/17 Python
浅谈Python3中print函数的换行
2020/08/05 Python
python爬虫如何解决图片验证码
2021/02/14 Python
可自定义箭头样式的CSS3气泡提示框
2016/03/16 HTML / CSS
Html5 postMessage实现跨域消息传递
2016/03/11 HTML / CSS
The Outnet亚太地区:折扣设计师时装店
2019/12/05 全球购物
JNI的定义
2012/11/25 面试题
2014年会演讲稿范文
2014/01/06 职场文书
电厂职工自我鉴定
2014/02/20 职场文书
学习雷锋做美德少年寄语大全
2014/04/09 职场文书
个人作风纪律整顿整改措施
2014/10/25 职场文书
2015清明节祭奠英烈寄语大全
2015/03/04 职场文书
2021年国产动漫公司排行前十名,玄机科技上榜,第二推出过铠甲勇士
2022/03/18 杂记