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 相关文章推荐
PHP 程序员应该使用的10个组件
Oct 31 PHP
php 5.3.5安装memcache注意事项小结
Apr 12 PHP
PHP实现根据设备类型自动跳转相应页面的方法
Jul 24 PHP
php生成shtml类用法实例
Dec 09 PHP
php获取当月最后一天函数分享
Feb 02 PHP
php超快高效率统计大文件行数
Jul 05 PHP
PHP网站建设的流程与步骤分享
Sep 25 PHP
php的api数据接口书写实例(推荐)
Sep 22 PHP
php事件驱动化设计详解
Nov 10 PHP
Yii Framework框架使用PHPExcel组件的方法示例
Jul 24 PHP
Yii使用EasyWechat实现小程序获取用户的openID的方法
Apr 29 PHP
PHP的垃圾回收机制代码实例讲解
Feb 27 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
DOTA2【瓜皮时刻】Vol.91 RTZ山史最惨“矿难”
2021/03/05 DOTA
php下删除一篇文章生成的多个静态页面
2010/08/08 PHP
php实现的支持imagemagick及gd库两种处理的缩略图生成类
2014/09/23 PHP
PHP封装的MSSql操作类完整实例
2016/05/26 PHP
Yii2框架实现登陆添加验证码功能示例
2018/07/12 PHP
php实现微信小程序授权登录功能(实现流程)
2019/11/13 PHP
在textarea文本域中显示HTML代码的方法
2007/03/06 Javascript
javascript实现的网站访问量统计代码
2015/12/20 Javascript
jQuery EasyUI中DataGird动态生成列的方法
2016/04/05 Javascript
JQuery给select添加/删除节点的实现代码
2016/04/26 Javascript
JavaScript编写带旋转+线条干扰的验证码脚本实例
2016/05/30 Javascript
jQuery解析与处理服务器端返回xml格式数据的方法详解
2016/07/04 Javascript
jQuery插件zTree实现获取一级节点数据的方法
2017/03/08 Javascript
整理关于Bootstrap排版的慕课笔记
2017/03/29 Javascript
Angular移动端页面input无法输入的解决方法
2017/11/14 Javascript
Angular实现点击按钮后在上方显示输入内容的方法
2017/12/27 Javascript
JavaScript eval()函数定义及使用方法详解
2020/07/07 Javascript
javaScript代码飘红报错看不懂?读完这篇文章再试试
2020/08/19 Javascript
python实现登陆知乎获得个人收藏并保存为word文件
2015/03/16 Python
用实例详解Python中的Django框架中prefetch_related()函数对数据库查询的优化
2015/04/01 Python
python实现查找两个字符串中相同字符并输出的方法
2015/07/11 Python
Python管理Windows服务小脚本
2018/03/12 Python
Python的numpy库中将矩阵转换为列表等函数的方法
2018/04/04 Python
Python判断两个list是否是父子集关系的实例
2018/05/04 Python
Django框架多表查询实例分析
2018/07/04 Python
Python3列表内置方法大全及示例代码小结
2019/05/10 Python
浅析HTML5页面元素及属性
2021/01/20 HTML / CSS
Gucci法国官方网站:意大利奢侈品牌
2018/07/25 全球购物
《美丽的彩虹》教学反思
2014/02/25 职场文书
学生顶撞老师的检讨书
2014/09/17 职场文书
教师聘用意向书
2015/05/11 职场文书
优秀志愿者感言
2015/08/01 职场文书
Django模型层实现多表关系创建和多表操作
2021/07/21 Python
从QQtabBar看css命名规范BEM的详细介绍
2021/08/07 HTML / CSS
搞笑Gif:这么白这么长的腿像极了一楼的女朋友
2022/03/21 杂记
Promise静态四兄弟实现示例详解
2022/07/07 Javascript