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 相关文章推荐
phpmyadmin config.inc.php配置示例
Aug 27 PHP
PHP CURL CURLOPT参数说明(curl_setopt)
Sep 30 PHP
调试PHP程序的多种方法介绍
Nov 06 PHP
Codeigniter的一些优秀特性总结
Jan 21 PHP
DEDECMS首页调用图片集里的多张图片
Jun 05 PHP
php简单判断文本编码的方法
Jul 30 PHP
php自定义函数实现JS的escape的方法示例
Jul 07 PHP
Yii2下点击验证码的切换实例代码
Mar 14 PHP
Yii2框架实现登录、退出及自动登录功能的方法详解
Oct 24 PHP
PHP实现关键字搜索后描红功能示例
Jul 03 PHP
php 的多进程操作实践案例分析
Feb 28 PHP
jQuery+PHP实现图片上传并提交功能
Jul 27 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反弹shell实现代码
2009/04/22 PHP
jQuery 对象中的类数组操作
2009/04/27 Javascript
使用js显示当前时间示例
2014/03/02 Javascript
Javascript的&amp;&amp;和||的另类用法
2014/07/23 Javascript
jQuery实现表单提交时判断的方法
2014/12/13 Javascript
js实现创建删除html元素小结
2015/09/30 Javascript
解决jQuery上传插件Uploadify出现Http Error 302错误的方法
2015/12/18 Javascript
浅析$.getJSON异步请求和同步请求
2016/06/06 Javascript
Angular.Js中过滤器filter与自定义过滤器filter实例详解
2017/05/08 Javascript
解决BootStrap Fileinput手机图片上传显示旋转问题
2017/06/01 Javascript
基于vue2.0实现的级联选择器
2017/06/09 Javascript
js字符限制(字符截取) 一个中文汉字算两个字符
2017/09/12 Javascript
基于webpack4搭建的react项目框架的方法
2018/06/30 Javascript
如何在Vue.js中实现标签页组件详解
2019/01/02 Javascript
小程序云开发之用户注册登录
2019/05/18 Javascript
七行JSON代码把你的网站变成移动应用过程详解
2019/07/09 Javascript
python中enumerate的用法实例解析
2014/08/18 Python
Python内置的字符串处理函数详细整理(覆盖日常所用)
2014/08/19 Python
Python使用matplotlib实现的图像读取、切割裁剪功能示例
2018/04/28 Python
Python实现购物评论文本情感分析操作【基于中文文本挖掘库snownlp】
2018/08/07 Python
使用Python正则表达式操作文本数据的方法
2019/05/14 Python
django如何实现视图重定向
2019/07/24 Python
Django如何批量创建Model
2020/09/01 Python
关于老式浏览器兼容HTML5和CSS3的问题
2016/06/01 HTML / CSS
美国最大的网上冲印店:Shutterfly
2017/01/01 全球购物
美国定制钻石订婚戒指:Ritani
2017/12/08 全球购物
英国最好的温室之家:Greenhouses Direct
2019/07/13 全球购物
俄罗斯香水在线商店:AromaCode
2019/12/04 全球购物
机电专业毕业生求职信
2013/10/27 职场文书
英语专业推荐信
2013/11/16 职场文书
护理专业毕业生自我鉴定总结
2014/03/24 职场文书
体育教师个人总结
2015/02/09 职场文书
2015年优质护理服务工作总结
2015/04/08 职场文书
土木工程生产实习心得体会
2016/01/22 职场文书
html+css合并表格边框的示例代码
2021/03/31 HTML / CSS
【海涛解说】pis亲自推荐,其实你从来不会玩NW
2022/04/01 DOTA