第十四章 缓存

目录
设置缓存
一个页面的多个缓存
缓存组
控制插件输出的可缓存性

    缓存通过保存其输出到一个文件而提高调用display()fetch()的速度。如果调用时有可用缓存的版本,将显示该版本而不用重新生成输出。缓存可以大幅提高速度,特别是模板需要大量计算的时候。由于display()fetch()的输出得到缓存,一个缓存文件可以基本上可以由若干个模板文件,配置文件等组成。

    由于模板是动态的,因此缓存什么以及缓存多长时间是很重要的一个问题。例如,如果你显示你站点的首页,其内容不会经常更改,那么将该页面缓存一个小时甚至更长时间是可行的。另一方面,如果你要显示的页面包含一个时间表,每分钟都有新的信息,那么缓存该页面就没有任何意义。

设置缓存

    激活缓存的第一步是设置$caching = 1(或2)。

例子14-1. 激活缓存

<?php
require('Smarty.class.php');
$smarty = new Smarty;

$smarty->caching 1;

$smarty->display('index.tpl');
?>

    一旦激活缓存,函数调用display('index.tpl')会按常规渲染该模板,同时保存其输出为一个文件(缓存拷贝)到$cache_dir中。下次调用display('index.tpl')时,将使用缓存的拷贝而不是重新渲染模板。

技术注解:$cache_dir中的文件命名类似于模板名。尽管它们的后缀是PHP,它们不应该直接被运行。也不要编辑这些文件!

    每个缓存页面的有效时间都是有限的,并由$cache_lifetime决定。缺省值为3600秒,也即一个小时。该段时间过后,缓存将被重新生成。设置$caching=2时可以为每个缓存设置其各自的有效时间。参见$cache_lifetime以获得更多信息。

例子14-2. 为每个缓存设置$cache_lifetime

<?php
require('Smarty.class.php');
$smarty = new Smarty;

$smarty->caching 2// 每个缓存一个有效时间

// index.tpl的cache_lifetime为5分钟
$smarty->cache_lifetime 300;
$smarty->display('index.tpl');

// home.tpl的cache_lifetime为一个小时
$smarty->cache_lifetime 3600;
$smarty->display('home.tpl');

// 注意:以下的$cache_lifetime设置在$caching = 2时不起作用。
// home.tpl的缓存有效时间已经设置为
// 1小时,不再考虑$cache_lifetime的值。
// home.tpl缓存的有效期还是1小时
$smarty->cache_lifetime 30// 30秒
$smarty->display('home.tpl');
?>

    如果激活$compile_check,牵涉到缓存文件的每个模板文件和配置文件都会被检查是否修改。如果任何文件自缓存创建后被修改了,将立即重新生成缓存。对于优化性能而言,是小小的额外开销,所以可以考虑设置$compile_checkFALSE

例子14-3. 激活$compile_check

<?php
require('Smarty.class.php');
$smarty = new Smarty;

$smarty->caching 1;
$smarty->compile_check true;

$smarty->display('index.tpl');
?>

    如果激活$force_compile,那么缓存文件总是会被重新生成,也就实际上关闭了缓存。$force_compile通常只用于调试的目的。关闭缓存更有效的方法是设置$caching = 0

    而is_cached()函数可以测试一个模板是否有合法的缓存。如果你有一个缓存的模板需要诸如数据库操作,那么可以跳过该步骤。

例子14-4. 使用is_cached()

<?php
require('Smarty.class.php');
$smarty = new Smarty;

$smarty->caching 1;

if(!
$smarty->is_cached('index.tpl')) {
    
// 没有可用的缓存,进行变量赋值
    
$contents get_database_contents();
    
$smarty->assign($contents);
}

$smarty->display('index.tpl');
?>

    你可以使用{insert}函数保持一个页面的部分为动态。比如说,整个页面都被缓存了,除了一个显示在页面底部的横幅。通过使用{insert}函数来显示横幅,你可以保持在缓存内容中该元素的动态显示。参见{insert}的说明以获得该例子更多的信息。

    使用clear_all_cache()函数可以清除所有的缓存文件,或者用clear_cache()函数清空一个缓存文件或缓存组

例子14-5. 清除缓存

<?php
require('Smarty.class.php');
$smarty = new Smarty;

$smarty->caching 1;

// 只清除index.tpl的缓存
$smarty->clear_cache('index.tpl');

// 清除所有缓存
$smarty->clear_all_cache();

$smarty->display('index.tpl');
?>