smarty缓存机制

来源:网站建设 2014-03-04

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

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

  1、全局缓存

  顾名思义,全局缓存就是为整个网站的全部页面都生成缓存页面。

  首先我们要操作smarty的配置文件,开启缓存,指定缓存文件目录,并设置缓存的存活时间

  $smarty->cache_dir = ‘./cache/’; //设置存放缓存文件的文件夹

  $smarty->caching = 1;//开启缓存 0、FALSE代表关闭|非0数字、TRUE代表开启

  $smarty->cache_lifetime = 3600//单位为秒(如果填写-1为永不过期)

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

  $url=md5($_SERVER['REQUEST_URI']);//将当前页面的URL(包含?后面的所有参数)进行md5加密

  $smarty->display(‘list2.html’,$url);//设置缓存文件名

  需要注意的是:

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

  第二个参数不是必须的,如果不写的话,缓存文件名就是讲过加密处理的模板文件名。

  但是这样会碰到一个比较棘手的问题:

  http://localhost/1.10/sm/list2.php?lan=1

  http://localhost/1.10/sm/list2.php?lan=2

  http://localhost/1.10/sm/list2.php?lan=3

  3个URL对应应该的不同的内容,但是生成的缓存文件名都是list2.html加密后的结果。

  这就会导致用户想要查询的是不同的内容,访问的却是同一个缓存文件。

  所以建议加上一个辅助参数,将访问url(包含?后面的所有参数)md5加密是作者比较推荐的一种。

  2、部分缓存

  首先了解什么叫部分缓存,其实就是指定一些文件生成缓存文件,而非网站的全部文件。

  了解了需要达到的效果,接下来我们就来具体操作

  操作之前,我们先要强调一个概念:

  部分缓存的实质其实是部分不缓存,也就是说不是指定那些文件生成缓存,而是指定具体一些文件不生成缓存

  假设有3个文件:

  1.php //需要缓存

  2.php //需要缓存

  3.php //不需要缓存

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

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

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

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

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

  3、局部缓存

  首先让我们了解下局部缓存的意思,就是指定同一页面下的某些局部地方生成缓存。

  同样的在这里我们也要把思路反转一下。

  其实不是指定哪些局部生成缓存,而是哪些局部不生成缓存(这和部分缓存的操作思想是类似的)。

  话不多说,先举一个实例

  1.php

  $time=time();

  $smarty->assign(‘time’,$lanmuarr);

  function insert_timeget()

  {

  return time();

  }

  $smarty->display(’1.html’);


  1.html

  {$time}

  //开启缓存后,重复刷新这个不会变

  {insert name=’timeget’}

  //开启缓存后,重复刷新这个会变

  看懂了这个例子我们来解释下其中的原理

  在PHP中我们只要定义了

  函数名为insert_自定义补充名的自定义函数,在其中返回的值,不需要assign()方法传递,就能直接在模板页面中以{insert name=’自定义补充名’}的方式调用,同时不会受到缓存的影响,而实时刷新

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



////////////////////////////////////////////////////////////////////////////////////////

全面剖析Smarty缓存机制一[三种缓存方式]
作者:unvs 日期:2012-9-23 23:0:0

今天主要全面总结下Smarty模板引擎中强大的缓存机制,缓存机制有效减少了系统对服务器的压力,而这也是很多开发者喜欢Smarty的原因之一,由于篇幅较大,便于博友阅读,这篇文章将剖析Smarty缓存的几种方式,下篇文章着重讲解下设置缓存及清除缓存的技巧方法(其中包含缓存集合方法)。

一、Smarty缓存的几种方式
缓存机制中,分为全局缓存、部分缓存、局部缓存三种方式,后面会一一讲述,下面是缓存设置前,Smarty类方法基本目录设置如下:
$smarty->Smarty();
$smarty->template_dir = $ROOT."/templates";//模板目录
$smarty->compile_dir = $ROOT."/templates_c";//编译目录
$smarty->cache_dir = $ROOT."/cache";//缓存目录
$smarty->caching = true;//是否开启缓存,值为0,1,2,0则不开启:1则开启缓存:2则可设置特殊缓存,即在加载模板页前,对局部进行缓存时间的特殊设定,后面会讲到;可不写,默认为true-开启 
$smarty->cache_lifetime = "3600";//缓存时间 ,可不写,默认为3600
$smarty->compile_check = true;//是否进行编译,可不写,默认为true

缓存机制中调用模板生成缓存页面,用的一个display()方法,将会在后文中用到,这里先讲解一下:
$smarty->display(string template[, string cache_id[, string compile_id]]);
第一个必须参数:template,为需显示的模板;
第二个可选参数:cache_id,可指定一个缓存号,此参数是给页面缓存添加一个标识的作用;
第三个可选参数:compile_id,可指定一个编译号 ,此参数是把一个模板编译成不同版本时使用,同样是起一个标识的作用,不常用。

上面代码简洁、说明易懂吧!若引用创建Smarty类都不知,那下面可以省了,呵,开个玩笑!接着往下看。

1、全局缓存方式
定义:字面上看,意思很明了,就是为整个网站的全部页面都进行缓存生成,只要页面调用了Smarty类模板。
代码实例:其实,在这段之前的基本目录设置中就讲到了,为说明,用蓝颜色标明了出来代码,只要在类中这样设置,并在页面中进行如下引用,页面即进行了缓存,
$smarty->display('index.tpl');
而这条语句,有一个很大的缺陷,就是一个模板即一个模板页面,只生成一个缓存,而我们知道,大多网站的多数页面后面会接一些参数或不同页面调用同一个模板,比如:
http://blog.unvs.cn/archives/2012_9.html
http://blog.unvs.cn/archives/2012_8.html
http://blog.unvs.cn/archives/2012_7.html
比方这些是调用的同一个模板生成的页面,但是又必须生成3个缓存,使用上面的语句肯定做不到,这里我们要想到一开始讲到的第二个可选参数cache_id,用一个缓存号,来区分同一个模板生成不同的页面及缓存,代码实例:
$cache_id = $_GET['id'];//url中的id参数值
$smarty->display('index.tpl', $cache_id);//将缓存号加入,即可完成--同一模板--不同参数--不同缓存 的功能;
到这里,有人发现,如果我的页面不止一个参数,那是不是得全部解析出来并做为缓存号?这里有一个更好的方法,推荐给大家,也是网上大多赞同的。(其实,上面一段是'废话‘,可去掉,但为了循序渐进,更好理解而写的过渡,谅)
推荐的方法是:你可以直接将整个当前URL获取下来,作为cache_id加入缓存,这样无论它多少个参数,都不会存在同一个缓存页,
代码实例:
$url=$_SERVER['REQUEST_URI'];//获取当前页URL,有的将url进行md5加密,亦可
$smarty->display('index.tpl', $url);

2、部分缓存方式
定义:意思就是,网站系统的部分页面进行缓存,而一些页面不进行缓存,比方网站的注册、登录处理页面可不进行缓存。
一种处理方式:在display()方法前或后面,将此模板缓存进行一次清除操作,注意保持两者参数必须一致;
代码实例:
$smarty->clear_cache(“index.tpl”);//此句放在display方法句前后都可以
$smarty->display(“index.tpl”);//与clear_cache方法参数必须一致
另一种处理方式:原理是一样的,因为部分缓存相当于两种情况,你可以另写一个display方法进行重构,其中一个参数判断是否进行缓存,若不,则进行clear_cache()方法处理,否则进行缓存;
代码实例:
function display($temp_name, $cache_id = null,$is_cache = true){
if($is_cache){
$smarty->clear_cache(“index.tpl”, $cache_id);
$smarty->display(“index.tpl”, $cache_id);//此两句不解,见上面绿色代码
}else{
$smarty->display(“index.tpl”, $cache_id);  
}}
调用方法:self::display($temp_name, $cache_id, false);//这样设置即不进行缓存,有任何疑问可留言提出。

3、局部缓存方式
定义:一个页面,一些地方不进行缓存,保持动态更新,每次都加载,比如文章详细页的浏览次数、登录窗口框等。
有几种可实现局部缓存的方法(反面即处理好不缓存的地方就可实现局部缓存),着重讲解1、2种方法,我觉得就可以了,不用学会那么多。
a、使用SMarty引擎中内置的nocache函数,实现不缓存功能(smarty3.1.8版支持,不知smarty2+是否支持)
直接在tpl或html模板页中,不缓存区域加入{nocache}不缓存内容{/nocache}即可。
代码实例:
处理页面:$smarty->assign("time",time());
模板页面:{nocache}<{$time}>{/nocache}
b、注册块方法,实现不缓存
写一个no_cached方法,并调用smarty注册块函数将方法进行注册,即可实现,直接贴实例。
代码实例:
处理页面:$smarty->assign("time",time());
function no_cached($param, $content){//参数$param为块参数数组,参数$content为不缓存内容
return $content;
}
$smarty->register_block("no_cached", “no_cached”, false);//注册块方法:register_block($tpl_func, $reg_func, $cacheable);//参数1为模板函数;参数2为需注册的函数即上面写的函数;参数3为是否进行缓存,这里必须设置为false
模板页面:{no_cached}<{$time}>{/no_cached}
c、当然还有其他一些方法,比如:注册函数等,这里就不介绍了,其中注册块详细使用,请查看smarty说明书,这里就不详述了。

4、缓存机制中的is_cached用法
最后,说下is_cached($temp_tpl[, $cache_id])判断是否已被缓存这个方法,$temp_tpl参数为模板页,$cache_id参数为缓存号,这个方法主要用在加载模板前进行缓存判断,若不存在就加载数据,若存在直接跳过,这样就达到了缓存的最终目的。
示例:
if(!smarty->is_cached('index.tpl')){//不存在缓存
//调用数据库,并对变量进行赋值
}
$smarty->display('index.tpl');//加载模板页

到这里,Smarty中缓存机制的几种方式就全部详细讲解完了,其中每部分都分别以代码实例展示