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 相关文章推荐
详细介绍:Apache+PHP+MySQL配置攻略
Sep 05 PHP
用PHP和ACCESS写聊天室(五)
Oct 09 PHP
PHP 和 XML: 使用expat函数(三)
Oct 09 PHP
php读取msn上的用户信息类
Dec 05 PHP
php自动获取目录下的模板的代码
Aug 08 PHP
Codeigniter实现智能裁剪图片的方法
Jun 12 PHP
symfony表单与页面实现技巧
Jan 26 PHP
php编写批量生成不重复的卡号密码代码
May 14 PHP
php 流程控制switch的简单实例
Jun 07 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
Feb 23 PHP
PHPTree――php快速生成无限级分类
Mar 30 PHP
Yii使用EasyWechat实现小程序获取用户的openID的方法
Apr 29 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中执行cmd命令的方法
2014/10/11 PHP
PHP使用pcntl_fork实现多进程下载图片的方法
2014/12/16 PHP
php简单压缩css样式示例
2016/09/22 PHP
php事务回滚简单实现方法示例
2017/03/28 PHP
PHP文件打开关闭及读写操作示例解析
2020/08/06 PHP
IE8 兼容性问题(属性名区分大小写)
2009/06/04 Javascript
javascript document.execCommand() 常用解析
2009/12/14 Javascript
ASP.NET jQuery 实例8 (动态添加内容到DropDownList)
2012/02/03 Javascript
解析Jquery的LigerUI如何实现文件上传
2013/07/09 Javascript
IE的事件传递-event.cancelBubble示例介绍
2014/01/12 Javascript
jquery制作搜狐快站页面效果示例分享
2014/02/21 Javascript
node.js中的fs.appendFileSync方法使用说明
2014/12/17 Javascript
使用javascript实现json数据以csv格式下载
2015/01/09 Javascript
Node.js事件驱动
2015/06/18 Javascript
jquery实现带缩略图的可定制高度画廊效果(5种)
2015/08/28 Javascript
JavaScript数组去重的五种方法
2015/11/05 Javascript
JavaScript数组去重由慢到快由繁到简(优化篇)
2016/08/26 Javascript
概述如何实现一个简单的浏览器端js模块加载器
2016/12/07 Javascript
Jquery实现跨域异步上传文件总结
2017/02/03 Javascript
ionic2打包android时gradle无法下载的解决方法
2017/04/05 Javascript
Vue不能观察到数组length的变化
2018/06/08 Javascript
原生JS实现动态加载js文件并在加载成功后执行回调函数的方法
2020/12/30 Javascript
深入理解令牌认证机制(token)
2019/08/22 Javascript
KnockoutJS数组比较算法实例详解
2019/11/25 Javascript
python实现html转ubb代码(html2ubb)
2014/07/03 Python
在Python中使用__slots__方法的详细教程
2015/04/28 Python
Python从零开始创建区块链
2018/03/06 Python
解决tensorflow模型参数保存和加载的问题
2018/07/26 Python
对Python 多线程统计所有csv文件的行数方法详解
2019/02/12 Python
Python @property装饰器原理解析
2020/01/22 Python
Python读取excel文件中带公式的值的实现
2020/04/17 Python
英国办公用品商店:Office Outlet
2018/04/04 全球购物
美国孕妇装购物网站:Motherhood Maternity
2019/09/22 全球购物
2014法制宣传日活动总结范文
2014/11/01 职场文书
解析:创业计划书和商业计划书二者之间到底有什么区别
2019/08/14 职场文书
安装配置mysql及Navicat prenium的详细流程
2021/06/10 MySQL