新随笔  :: 联系 :: 订阅 订阅  :: 管理

Smarty 学习笔记六 缓存

Posted on 2012-06-12 20:19  张贺  阅读(3329)  评论(0编辑  收藏  举报

官方文档对缓存技术的介绍:
缓存被用来保存一个文档的输出从而加速display()或fetch()函数的执行。如果一个函数被加进缓存,那么实际输出的内容将用缓存来代替。缓存可让事物非常快速的执行,特别是带有长计算时间的模板。一旦display()或fetch()用缓存输出,那么一个缓存文档将非常容易用几个模板文档或是配置文档等来组成〔功力不小〕。
一旦模板是动态〔应该不难理解〕的,哪些文档你加了缓存,缓存时间多长都是很重要的。举个例子,比如你站点的首页内容不是经常更改,那么对首页缓存一个小时或是更长都可得到很好效果。相反,几分钟就要更新一下信息的天气地图页面,用缓存就不好了。
设置缓存目录
在使用缓存之前,首先要确定好缓存文件的保存目录,可通过下列两种方法设定缓存目录:

  • 设定$cache_dir变量值,默认值为./cache。即当前执行的PHP脚本所在目录下的cache目录。如:
    1 <?php
    2 $smarty->cache_dir = 'lib/smarty/cache';
    3 ?>

     

  • setCacheDir(string cache_dir); 通过向该方法中传递一个指定的路径信息来设定缓存文件的路径。(推荐使用该此种方法设定缓存目录)

 

 1 <?php
 2 
 3 // set directory where rendered template's output is stored
 4 $smarty->setCacheDir('./cache');
 5 
 6 // chaining of method calls
 7 $smarty->setTemplateDir('./templates')
 8 ->setCompileDir('./templates_c')
 9 ->setCacheDir('./cache');
10  
11 ?>

 

开启缓存功能
配置好缓存文件路径后,就可通过$caching打开Smarty缓存功能,该值可为:

  • Smarty::CACHING_LIFETIME_CURRENT:用$cache_lifetime来判断缓存文件是否过期。
  • Smarty::CACHING_LIFETIME_SAVED:根据缓存文件的生成时间与$cache_lifetime判断缓存文件是否过期,这个设定可以为特定的缓存文件设定特定的缓存时间。
  • Smarty::CACHING_OFF:关闭Smarty缓存功能(默认)
 1 <?php
 2 require('Smarty.class.php');
 3 $smarty = new Smarty;
 4 
 5 // uses the value of $smarty->cacheLifetime() to determine
 6 // the number of seconds a cache is good for
 7 $smarty->setCaching(Smarty::CACHING_LIFETIME_CURRENT);
 8 
 9 $smarty->display('index.tpl');
10 ?>

注:如果设定$compile_check属性为true时,当模版或配置文件变更后,缓存文件都将被重新生成。
设定缓存时间
$cache_lifetime定义缓存文件的有效时间,以秒为单位,一旦时间过期,缓存文件将会被重新生成(默认3600秒)。
如果将该值设定为-1,表示缓存文件永不过期,设定为0,缓存文件将总会被重新生成(仅用于开发阶段)。
可以将$caching值设定为Smarty::CACHING_LIFETIME_SAVED,在设定$caching_lifetime,这样,之后通过调用display()或fetch()来显示的模版,将会生成自己模版的独立的缓存时间。
注:使用该设定之前,必须保证$caching处于打开状态。

 1 <?php
 2 require('Smarty.class.php');
 3 $smarty = new Smarty;
 4 
 5 // retain current cache lifetime for each specific display call
 6 $smarty->setCaching(Smarty::CACHING_LIFETIME_SAVED);
 7 
 8 // set the cache_lifetime for index.tpl to 5 minutes
 9 $smarty->setCacheLifetime(300);
10 $smarty->display('index.tpl');
11 
12 // set the cache_lifetime for home.tpl to 1 hour
13 $smarty->setCacheLifetime(3600);
14 $smarty->display('home.tpl');
15 
16 // NOTE: the following $cache_lifetime setting will not work when $caching
17 // is set to Smarty::CACHING_LIFETIME_SAVED.
18 // The cache lifetime for home.tpl has already been set
19 // to 1 hour, and will no longer respect the value of $cache_lifetime.
20 // The home.tpl cache will still expire after 1 hour.
21 $smarty->setCacheLifetime(30); // 30 seconds
22 $smarty->display('home.tpl');
23 ?> 

$cache_id
某些时候你可能需要对一个页面生成多个缓存文件,如带有分页的页面,使用的模版相同,但不同页数的内容却不一样。对于这种情况,只需对display()或fetch()方法传递第二个参数cache_id既可。如当访问页面: http://127.0.0.1/test?page=1

1 <?php
2 $page = $_GET['page'];
3 $smarty->display('test.tpl', $page);
4 ?>

注:$cache_id将被用来生成的缓存文件名中的一部分来使用,所以需要限制$cache_id的命名规则,如不能使用空格,及其它一些特殊字符等。
在一个项目中,也许需要缓存成百上千个页面,默认情况下,这些缓存文件将全部被缓存到$cache_dir目录下,对与一些系统而言,将这些缓存文件存放到不同的子目录中去查找某一特定的文件,要比在一个包含了上千个文件目录中去查找一个特定文件,执行的速度要快得多。因此,我们有必要将这些缓存文件分别存储在缓存文件目录的子目录中。通过设定$cache_id可以到达这个目的。
首先需要设定$use_sub_dirs的值为ture,它允许我们在生成缓存文件的时候创建子缓存目录。
将要生成目录放到$cache_id中,之间用"|"分隔既可,如在我要打开admin/login.tpl模版文件时,我希望缓存文件同样存储在$cache_dir/admin/目录下,可以这样实现:

1 <?php
2 $smarty->use_sub_dirs = true;
3 $smarty->display('admin/login.tpl', 'admin|');
4 ?>

 

上述语句将会在你的缓存目录下自动创建一个admin目录,并将生成的login.tpl的缓存文件存放到该目录下,当然,你可以指定多层目录,如:'admin|user|login|',缓存文件将会保存在$chace_dir/admin/user/login/目录下。
注:上述涉及到的功能对与$compile_id同样生效

精确控制缓存
我们经常会遇到这种情况,一个页面包含多个部分,有些部分的内容变动几率很小,而有些部分的内容时时都在变动,如股票网站,网页中的股票走势图需要时时更新,而其它一些内容的更新频率不会很高,这是我们就需要只是真对页面中除走势图以外的所有内容进行缓存。Smarty的缓存机制非常灵活,可以为要缓存模版的某段区域指定为禁止缓存。如使用{nocache}{/nocache}标签,以及其它一些支持nocache的标签或方法。

1 {nocache}
2 {*通过{nocache}标签进行无缓存设置 *}
3 {$smarty.now|date_format}
4 {/nocache}
5 {*通过nocache属性进行无缓存设置*}
6 {$smarty.now|date_format nocache}
1 <?php
2 //通过向assign传递第三个参数true来设定无缓存
3 $smarty->assign('foo',time(),true);
4 ?>

删除缓存文件
void clearCache(string template, string cache_id, string compile_id, int expire_time);
用于清除指定模版的缓存文件。
可选参数expire_time:用来指定超过某一时间(以秒为单位)的缓存才会被清除。

1 <?php
2 // clear the cache for a template
3 $smarty->clearCache('index.tpl');
4 
5 // clear the cache for a particular cache id in an multiple-cache template
6 $smarty->clearCache('index.tpl', 'MY_CACHE_ID');
7 ?>

 

你也可以通过cache_id删除指定缓存目录下的子目录中的缓存文件,如:

1 $smarty->clearCache(null, 'admin|user|');

 

表示删除$cache_dir/admin/user/目录下的所有缓存文件。
clearAllCache(int expire_time);
清除所有缓存文件。

其它缓存常用变量与方法
$force_compile
设定该值为true时,则每次都会强制重新生成缓存文件,并会忽略$compile_check的设定,仅可在开发过程中打开该选项。默认为false。
bool isCached(string template, string cache_id, string compile_id);
判断指定模版是否存在有效的缓存文件,仅当$caching处于打开状态,该方法才可用。
参数cache_id和compile_id为可选参数。

1 <?php
2 $smarty->setCaching(Smarty::CACHING_LIFETIME_CURRENT);
3 
4 if(!$smarty->isCached('index.tpl')) {
5 // do database calls, assign vars here
6 }
7 
8 $smarty->display('index.tpl');
9 ?>

 

getCacheDir();
该方法用来获取缓存文件的路径信息。

1 <?php
2 
3 // get directory where compiled templates are stored
4 $cacheDir = $smarty->getCacheDir();
5 
6 ?>

 

$caching_type
用于设定缓存的资源类型,默认:file。关于资源类型,将在后面介绍。
$cache_modified_check
如果设置该变量为真,Smarty将分析客户端发送来的If-Modified-Since头信息.如果缓存文件时间戳自上次访问以来没有改变,则发送一个"304 Not Modified"头,而不是缓存文件内容.这种方式仅工作于没有 {insert} 标记的缓存内容.