Smarty的配置与高级缓存技术分享


Posted in PHP onJune 05, 2012

前言

Smarty 是一个出色的PHP模板引擎,它分离了逻辑代码和user interface。

学习和使用Smarty,没有应用到它的缓存技术是一个很大的损失,它可以将用户最终看到的HMTL文件缓存成一个静态的HTML页,当设定Smarty的cache属性为true时,在Smarty设定的cachetime期内将用户的WEB请求直接转换到这个静态的HTML文件中来,这相当于调用一个静态的HTML文件,给后台服务器减少很多负担。

下载与配置

官方下载:Smarty Download

下载完后,解压到自己项目的文件目录下。

require('../libs/Smarty.class.php'); 
$smarty = new Smarty; 
//$smarty->force_compile = true; //强迫编译 
$smarty->debugging = true; //调试 
$smarty->caching = true; //开启缓存 
$smarty->cache_lifetime = 120; //缓存存活时间(秒) $smarty->cache_dir = MY_SMARTY_DIR . '/cache/' ; //设置缓存的存放路径

注意:如果你发现缓存文件每次浏览都会发生改变,请看 Smarty的 force_compile , 它会强迫Smarty每次调用(重新)编译模板。这项设置不受$compile_check的限制。默认情况下,它是无效的。它对于开发和调试很方便.但它决不能使用于产品环境下.如果启动了缓存,每次将会重新生成缓存文件.

$smarty->force_compile = false; //强迫编译

Smarty 缓存技术

全局缓存
局部缓存
insert 法
动态 block 法
插件 block 法

全局缓存技术

顾名思义,全局缓存就是把整个页面生成缓存文件,指定该缓存文件的存活时间,在指定时间内再次浏览整个页面,将直接读取缓存文件。

$smarty->caching = true; //开启缓存 
$smarty->cache_lifetime = 120; //缓存存活时间(秒)

注意:一个模板只能有一个缓存文件,如果您的模板存在多个页面的话,就要为缓存 设置一个ID。 例如一个页面有多个文章:

http://website/index.php?p=1
http://website/index.php?p=2

//$_SERVER['REQUEST_URI']方法 
//将当前页面的URL(包含?后面的所有参数)进行md5加密 
$url=md5($_SERVER['REQUEST_URI']); 
//设置缓存文件名 
$smarty->display('index.tpl',$url);

重点:使用缓存技术,很大一个原因就是为了减少对数据库的读写,所以我们要用$smarty->isCached('index.tpl')来判断缓存是否存在,如果存在了就不要再次操作数据库。

if(!$smarty->isCached('index.tpl')){ 
echo "ACACHE NO FOUND!"; 
$sql = "SELECT * FROM test"; 
$query = mysql_query($sql); 
$row = mysql_fetch_row($query); 
$smarty->assign("loaddatabase",$row[1]); 
}

这里又有问题了,如果我改了数据库的某个内容,想更新显示内容,但是缓存又还没到消亡时间,那该肿么办呢?
$smarty->clearCache("index.tpl");
上面的clearCache可以解决这个问题,只要更新了数据后,调用clearCache清除一下缓存就可以了。

PS:我用的是Smarty3版本,这个版本很多方法的命名都发生变化了,如果是Smarty2的话会出现“Call of unknown method ‘isCached'.”,请使用$smarty->is_cached()。
后面出现的 Smarty3:registerPlugin(), Smarty2:register_block() 也一样是版本的问题。

下面我们来看一下有缓存和没缓存的速度比较:
1.首次浏览,没有缓存 Total Time 0.01421

Smarty的配置与高级缓存技术分享

2.第2次浏览,有缓存 Total Time 0.00308

Smarty的配置与高级缓存技术分享

这里我的index.php里只有几行代码,如果数据量大的话,就有明显的区别。

局部缓存技术

局部缓存 = 部分缓存, 就是一个页面的缓存中,并不是全都生成缓存,可以自定义设置某个功能模块不生成缓存,每次浏览都会更新数据;

例如:网页显示用户的状态、网页的统计数据、广告条等,这些数据的更新速度都非常快,不宜缓存,这样,局部缓存便有用武之地了。

局部缓存有3个方法:

一、insert法

insert 所包含的内容不会被缓存,每次调用该模板都会重新执行该函数.

使用方法:

注意这里的函数名一定要以insert开头,模板中的name与之对应。

index.php

//定义一个时间来测试insert与普通assign的差别 
$date = date("Y-m-d H:i:s"); 
$smarty->assign("date", $date); 
//insert 
function insert_get_current_time($date){ 
return date("Y-m-d H:i:s"); 
}

index.tpl
nocache:{insert name="get_current_time"} 
cache: {$date} 
[code] 
然后看生成的缓存文件:得出结论 insert 每次调用该模板都会重新执行该函数

nocache:<?php echo insert_get_current_time(array (
),$_smarty_tpl);?>

cache: 2012-06-04 15:46:52

这种方法简单,但是如果要显示的内容是一大块的,就不宜使用了。 
二、动态block 法 
php中自定义块 
index.php 
[code] 
//smarty 3 
// function declaration 
function smarty_block_nocache ($param,$content,$smarty) 
{ 
return $content; 
} 
// register with smarty 
$smarty->registerPlugin("function","nocache", "smarty_block_nocache");

开始有提到过,Smarty3是用registerPlugin , Smarty2则是用register_block

index.tpl

{nocache}{$date}{/nocache}
然后看缓存文件 , 得出结论每次调用该模板都会重新执行$date
[/code]
<?php echo $_smarty_tpl->tpl_vars['date']->value;?>

三、插件block 法 这个方法和第2个差不多,只是把php中的自定义块,放到smarty目录中的plugins文件夹中。 
在Smarty/plugins目录下建一个文件 block.nocache.php 内容如下:

<?php
function smarty_block_nocache($param, $content, $smarty)
{
return $content;
}
?>
[code]
tpl模板中的使用和第二个方法一样

总结
可以总结出Smarty缓存技术,能大大的提高网站的速度和质量,用法也比较简单。

最后提醒一下的就是, Smarty生成的缓存文件的扩展名虽然是php,但并不会被当作php代码来解析.

作者:那瞬间

PHP 相关文章推荐
打造计数器DIY三步曲(中)
Oct 09 PHP
给php新手谈谈我的学习心得
Feb 25 PHP
php中文乱码怎么办如何让浏览器自动识别utf-8
Jan 15 PHP
php获取mysql字段名称和其它信息的例子
Apr 14 PHP
php单态设计模式(单例模式)实例
Nov 18 PHP
php 把数字转换成汉字的代码
Jul 21 PHP
PHP内存使用情况如何获取
Oct 10 PHP
PHP+mysql实现从数据库获取下拉树功能示例
Jan 06 PHP
PHP读取XML格式文件的方法总结
Feb 27 PHP
PHP简单装饰器模式实现与用法示例
Jun 22 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
Jul 20 PHP
小程序微信支付功能配置方法示例详解【基于thinkPHP】
May 05 PHP
PHP Parse Error: syntax error, unexpected $end 错误的解决办法
Jun 05 #PHP
php中json_decode()和json_encode()的使用方法
Jun 04 #PHP
php安全之直接用$获取值而不$_GET 字符转义
Jun 03 #PHP
PHP版网站缓存加快打开速度的方法分享
Jun 03 #PHP
PHP仿盗链代码
Jun 03 #PHP
PHP通过session id 实现session共享和登录验证的代码
Jun 03 #PHP
PHP中设置时区方法小结
Jun 03 #PHP
You might like
PHP 创建标签云函数代码
2010/05/26 PHP
PHP缩略图等比例无损压缩,可填充空白区域补充色
2011/06/10 PHP
php链表用法实例分析
2015/07/09 PHP
数组Array进行原型prototype扩展后带来的for in遍历问题
2010/02/07 Javascript
js中substring和substr的定义和用法
2014/05/05 Javascript
jQuery中empty()方法用法实例
2015/01/16 Javascript
javascript操作ul中li的方法
2015/05/14 Javascript
Jquery实现遮罩层的方法
2015/06/08 Javascript
基于jquery实现人物头像跟随鼠标转动
2015/08/23 Javascript
jQuery简单入门示例之用户校验demo示例
2016/07/09 Javascript
浅谈JS继承_借用构造函数 &amp; 组合式继承
2016/08/16 Javascript
快速移动鼠标触发问题及解决方法(ECharts外部调用保存为图片操作及工作流接线mouseenter和mouseleave)
2016/08/29 Javascript
JS前向后瞻正则表达式定义与用法示例
2016/12/27 Javascript
webpack4.x下babel的安装、配置及使用详解
2019/03/07 Javascript
vue学习笔记五:在vue项目里面使用引入公共方法详解
2019/04/04 Javascript
详解Vue调用手机相机和相册以及上传
2019/05/05 Javascript
vue-父子组件和ref实例详解
2019/11/10 Javascript
详解小程序BackgroundAudioManager踩坑之旅
2019/12/08 Javascript
Vue+Element UI 树形控件整合下拉功能菜单(tree + dropdown +input)
2020/08/28 Javascript
python实现搜索指定目录下文件及文件内搜索指定关键词的方法
2015/06/28 Python
Python自动扫雷实现方法
2015/07/25 Python
python利用Tesseract识别验证码的方法示例
2019/01/21 Python
Linux上使用Python统计每天的键盘输入次数
2019/04/17 Python
python查看文件大小和文件夹内容的方法
2019/07/08 Python
django框架中间件原理与用法详解
2019/12/10 Python
Django CSRF认证的几种解决方案
2020/03/03 Python
python数据库操作mysql:pymysql、sqlalchemy常见用法详解
2020/03/30 Python
TensorFlow打印输出tensor的值
2020/04/19 Python
详解移动端HTML5音频与视频问题及解决方案
2018/08/22 HTML / CSS
俄罗斯化妆品和香水网上商店:Iledebeaute
2019/01/03 全球购物
学生安全教育材料
2014/02/14 职场文书
对外汉语教师推荐信
2015/03/27 职场文书
2016入党心得体会范文
2016/01/06 职场文书
nginx反向代理配置去除前缀案例教程
2021/07/26 Servers
小喇叭开始广播了! 四十多年前珍贵老照片
2022/05/09 无线电
Centos7 Shell编程之正则表达式、文本处理工具详解
2022/08/05 Servers