PHP模板引擎Smarty的缓存使用总结,Smarty缓存机制
分类:高并发

这里我们将分析一下如何开启和使用smarty缓存,如何清除smarty缓存以及smarty的全局缓存,部分缓存,局部缓存三种缓存机制。

前言

    大家应该知道缓存机制能有效的减轻网站的服务器压力,Smarty模板引擎的一大亮点就是为我们提供了非常简单的缓存操作,下面就让我们学习一下。

一、开启和使用smarty缓存

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

  首先我们要知道Smarty缓存机制分为全局缓存,部分缓存,局部缓存三种,我们一一介绍。

要开启smarty的缓存,只需在smarty设置参数里面将caching设为true,并指定cache_dir即可。同时设置cache_lefetime参数指定缓存生存时间(单位为秒)。如果要对相同页面生成多个不同的缓存,可以在display或fetch中加入第二参数cache_id,如:

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

  1、全局缓存

复制代码 代码如下:$smarty->display('index.tpl',$my_cache_id);

下载与配置

  顾名思义,全局缓存就是为整个网站的全部页面都生成缓存页面。
首先我们要操作smarty的配置文件,开启缓存,指定缓存文件目录,并设置缓存的存活时间

此特性可用于对不同的$_GET进行不同的缓存。

官方下载:Smarty Download

  $smarty->cache_dir = './cache/'; //设置存放缓存文件的文件夹
$smarty->caching = 1; //开启缓存 0、FALSE代表关闭|非0数字、TRUE代表开启
$smarty->cache_lifetime = 3600; //单位为秒(如果填写-1为永不过期)

二、清除smarty缓存

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

  接下来我们要去具体的php页面设置与之对应的具体缓存文件的名字

清除smarty缓存一般有以下几种方式:
复制代码 代码如下:
clear_all_cache();//清除所有缓存
clear_cache('index.tpl');//清除指定模板index.tpl的缓存
clear_cache('index.tpl',cache_id);//清除指定模板指定id的缓存

复制代码 代码如下:
require('../libs/Smarty.class.php');
$smarty = new Smarty;
//$smarty->force_compile = true; //强迫编译
$smarty->debugging = true; //调试
$smarty->caching = true; //开启缓存
$smarty->cache_lifetime = 120; //缓存存活时间(秒)

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

三、全局缓存

$smarty->cache_dir = MY_SMARTY_DIR . '/cache/' ; //设置缓存的存放路径

  需要注意的是:

全局缓存就是为整个网站的全部页面都生成缓存页面。设置全局缓存首先我们要操作smarty的配置文件,开启缓存,指定缓存文件目录,并设置缓存的存活时间,设置参数如下:
复制代码 代码如下:
$smarty->cache_dir='./cache/'; //设置存放缓存文件的文件夹
$smarty->caching=1;//开启缓存 0、FALSE代表关闭|非0数字、TRUE代表开启
$smarty->cache_lifetime=3600//单位为秒(如果填写-1为永不过期)

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

  $smarty->display('与之对应的模板文件名','缓存文件名的补充部分') 这个方法。

接下来我们要去具体的php页面设置与之对应的具体缓存文件的名字,在php页面中可按如下写法:

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

  第二个参数不是必须的,如果不写的话,缓存文件名就是讲过加密处理的模板文件名。
但是这样会碰到一个比较棘手的问题:

复制代码 代码如下:$smarty->display('list2.html',md5($_SERVER['REQUEST_URI']));//将当前页面的URL(包含?后面的所有参数)进行md5加密然后设置缓存文件名

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

  

需要注意的是:
复制代码 代码如下:
$smarty->display('与之对应的模板文件名','缓存文件名的补充部分')这个方法。

全局缓存技术

  3个URL对应应该的不同的内容,但是生成的缓存文件名都是list2.html加密后的结果。
这就会导致用户想要查询的是不同的内容,访问的却是同一个缓存文件。
所以建议加上一个辅助参数,将访问url(包含?后面的所有参数)md5加密是作者比较推荐的一种。
2、部分缓存

第二个参数不是必须的,如果不写的话,缓存文件名就是模板文件名经过加密处理后的文件。但是这样会碰到一个比较棘手的问题,例如:
复制代码 代码如下:

顾名思义,全局缓存就是把整个页面生成缓存文件,指定该缓存文件的存活时间,在指定时间内再次浏览整个页面,将直接读取缓存文件。
复制代码 代码如下:
$smarty->caching = true; //开启缓存
$smarty->cache_lifetime = 120; //缓存存活时间(秒)

  首先了解什么叫部分缓存,其实就是指定一些文件生成缓存文件,而非网站的全部文件。
了解了需要达到的效果,接下来我们就来具体操作
操作之前,我们先要强调一个概念:
部分缓存的实质其实是部分不缓存,也就是说不是指定那些文件生成缓存,而是指定具体一些文件不生成缓存

这两个个URL对应应该的不同的内容,但是生成的缓存文件名都是 article 加密后的结果。这就会导致用户想要查询的是不同的内容,访问的却是同一个缓存文件。所以建议加上一个辅助参数,将访问url(包含?后面的所有参数)md5加密是比较靠谱的一种做法。

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

  假设有3个文件:

四、部分缓存



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

  1.php //需要缓存
2.php //需要缓存
3.php //不需要缓存

部分缓存就是指定一些文件生成缓存文件,而非网站的全部文件。部分缓存的实质其实是部分不缓存,也就是说不是指定哪些文件生成缓存,而是指定具体一些文件不生成缓存。现在假设有3个文件:
复制代码 代码如下:
//需要缓存
//需要缓存
//不需要缓存

重点:使用缓存技术,很大一个原因就是为了减少对数据库的读写,所以我们要用$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]);
}

  在1.php/2.php文件中还是照旧写上$smarty->display('与之对应的模板文件名','缓存文件名的补充部分')这个方法。

前面两个文件的php文件里面还是需要写上$smarty->display('与之对应的模板文件名','缓存文件名的补充部分')这句。

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

  但在3.php中我们要特别指明不需要生成缓存,具体的方法是:

但在第三个文件中我们要特别指明不需要生成缓存,具体的方法是在display指定模板之前写上下面这段代码:
复制代码 代码如下:
$smarty->clear_cache('与之对应的模板文件名');//其实写在$smarty->display('与之对应的模板文件名')之前还是之后都可以

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

  $smarty->clear_cache('与之对应的模板文件名');
//写在$smarty->display('与之对应的模板文件名')之前还是之后都可以

当然$smarty->display('与之对应的模板文件名')还是要写,本来就不想生成缓存,第二个参数也就不需要了。

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

  当然$smarty->display('与之对应的模板文件名')还是要写,本来就不想生成缓存,第二个参数也就不需要了。

注意:$smarty->clear_cache()和$smarty->display()的参数一定要写成一致的

图片 1

  $smarty->clear_cache()和$smarty->display()的参数一定要写成一致的.
3、局部缓存

五、局部缓存

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

  首先让我们了解下局部缓存的意思,就是指定同一页面下的某些局部地方生成缓存。
同样的在这里我们也要把思路反转一下。
其实不是指定哪些局部生成缓存,而是哪些局部不生成缓存(这和部分缓存的操作思想是类似的)。
话不多说,先举一个实例

局部缓存就是指定同一页面下的某些局部地方生成缓存。其实它不是指定哪些局部生成缓存,而是哪些局部不生成缓存(这和部分缓存的操作思想是类似的)。我们先来看下面一个例子:

图片 2

  1.php

article.php 文件部分内容如下:
复制代码 代码如下:

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

  $time=time();
$smarty->assign('time',$lanmuarr);
function insert_timeget()
{
return time();
}
$smarty->display('1.html');

$time=time();

局部缓存技术

  1.html

$smarty->assign('time',$lanmuarr);

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

  {$time}
//开启缓存后,重复刷新这个不会变
{insert name='timeget'}
//开启缓存后,重复刷新这个会变

function insert_timeget(){

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

  看懂了这个例子我们来解释下其中的原理:
在PHP中我们只要定义了函数名为insert_自定义补充名的自定义函数,在其中返回的值,不需要assign()方法传递,就能直接在模板页面中以{insert name='自定义补充名'}的方式调用,同时不会受到缓存的影响,而实时刷新.

return time();

局部缓存有3个方法:

  好了到这里我们关于smarty的3种缓存方式就全部讲解完了,有兴趣的朋友可以自己试验下不同的效果。

}

一、insert法

$smarty->display('article.html');

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

对应模板文件article.html部分代码如下:
复制代码 代码如下:

使用方法:

{$time}

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

{insert name='timeget'}

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");
}

这里对上面的例子做一下解释:在PHP中我们只要定义了函数名为 insert_ (注意下划线)自定义补充名的自定义函数,在其中返回的值,不需要assign()方法传递,就能直接在模板页面中以{insert name='自定义补充名'}的方式调用,同时不会受到缓存的影响,而实时刷新。

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

另外补充的一下是如果你感觉使用 Smarty 缓存不够爽的话,还可以使用自定义缓存,如何使用自定义缓存呢?

nocache:

这里需要设置cache_handler_func使用自定义的函数处理缓存,如:
复制代码 代码如下:
$smarty->cache_handler_func="myCache";

),$_smarty_tpl);?>

function myCache($action,&$smarty_obj,&$cache_content,$tpl_file=null,$cache_id=null,$compile_id=null){

cache: 2012-06-04 15:46:52
复制代码 代码如下:

switch($action){

这种方法简单,但是如果要显示的内容是一大块的,就不宜使用了。

case "read"://读取缓存内容

二、动态block 法

case "write"://写入缓存

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");

case "clear"://清空

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

}

index.tpl

}

{nocache}{$date}{/nocache}
然后看缓存文件 , 得出结论每次调用该模板都会重新执行$date
[/code]

tpl_vars['date']->value;?>
复制代码 代码如下:
三、插件block 法

这个方法和第2个差不多,只是把php中的自定义块,放到smarty目录中的plugins文件夹中。

在Smarty/plugins目录下建一个文件 block.nocache.php 内容如下:

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

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

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

作者:那瞬间

本文由10bet手机官网发布于高并发,转载请注明出处:PHP模板引擎Smarty的缓存使用总结,Smarty缓存机制

上一篇:php生成图形验证码几种方法小结,数学运算验证码实现代码 下一篇:没有了
猜你喜欢
热门排行
精彩图文