Smarty 图标

你可以根据 商标声明 使用 Smarty 徽标。

Smarty Template Engine Smarty Template Engine

对于赞助、广告、新闻或其他查询,请联系:

使用 Smarty 的网站

广告

第 15 章 缓存

通过将调用输出保存到文件中来加速对 display()fetch() 的调用。如果调用已缓存的版本,则显示该版本而不是重新生成输出。缓存可以极大地加快速度,尤其对于计算时间较长的模板。由于 display()fetch() 的输出已缓存,因此一个缓存文件可能由几个模板文件、配置文件等组成。

由于模板是动态的,因此谨慎处理缓存的内容和缓存时间非常重要。例如,如果你要显示网站首页,其内容变化不大,则可以将此页面缓存一个小时或更长时间。另一方面,如果你要显示一个包含每分钟都有新信息的时刻表页面,则缓存此页面就没有意义。

设置缓存

首先,要启用缓存,需将 $caching 设置为 Smarty::CACHING_LIFETIME_CURRENTSmarty::CACHING_LIFETIME_SAVED 中的一个。

示例 15.1 启用缓存

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

// uses the value of $smarty->cacheLifetime() to determine
// the number of seconds a cache is good for
$smarty->setCaching(Smarty::CACHING_LIFETIME_CURRENT);

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

    

在启用缓存的情况下,调用 display('index.tpl') 的函数将像往常一样渲染模板,但也将输出的副本保存到 $cache_dir 中的文件(缓存副本)。在下一次调用 display('index.tpl') 时,将使用缓存的副本,而不是再次渲染模板。

技术注释

位于 $cache_dir 中的文件名称类似于模板名称。尽管它们的扩展名为 .php,但它们不适于直接执行。不要编辑这些文件!

每个缓存页面的有效期由 $cache_lifetime 决定。默认值为 3600 秒,即一小时。到期后,缓存将重新生成。可以通过将 $caching 设置为 Smarty::CACHING_LIFETIME_SAVED 为各个缓存设置其独立的到期时间。有关详细信息,请参见 $cache_lifetime

示例 15.2. 为每个缓存设置 $cache_lifetime

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

// retain current cache lifetime for each specific display call
$smarty->setCaching(Smarty::CACHING_LIFETIME_SAVED);

// set the cache_lifetime for index.tpl to 5 minutes
$smarty->setCacheLifetime(300);
$smarty->display('index.tpl');

// set the cache_lifetime for home.tpl to 1 hour
$smarty->setCacheLifetime(3600);
$smarty->display('home.tpl');

// NOTE: the following $cache_lifetime setting will not work when $caching
// is set to Smarty::CACHING_LIFETIME_SAVED.
// The cache lifetime for home.tpl has already been set
// to 1 hour, and will no longer respect the value of $cache_lifetime.
// The home.tpl cache will still expire after 1 hour.
$smarty->setCacheLifetime(30); // 30 seconds
$smarty->display('home.tpl');
?>

    

如果启用了 $compile_check(默认情况下启用),将检查与缓存文件相关的每个模板文件和配置文件是否被修改。如果自生成缓存之后任何文件被修改,将立即重新生成缓存。这会增加计算开销,因此为了获得最佳性能,请将 $compile_check 设置为 FALSE

示例 15.3. 禁用 $compile_check

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

$smarty->setCaching(Smarty::CACHING_LIFETIME_CURRENT);
$smarty->setCompileCheck(false);

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

    

如果启用了 $force_compile,缓存文件将始终重新生成。这实际上禁用了缓存,但也会严重降低性能。 $force_compile 用于 调试 目的。禁用缓存的恰当方法是将 $caching 设置为 Smarty::CACHING_OFF.

可以使用 isCached() 函数测试模板是否具有有效的缓存。如果已缓存模板并需要数据库提取之类的操作,可以使用本函数跳过该进程。

示例 15.4. 使用 isCached()

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

$smarty->setCaching(Smarty::CACHING_LIFETIME_CURRENT);

if(!$smarty->isCached('index.tpl')) {
    // No cache available, do variable assignments here.
    $contents = get_database_contents();
    $smarty->assign($contents);
}

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

    

可以使用 {nocache}{/nocache} 块函数、{insert} 函数或通过对大部分模板函数使用 nocache 参数动态保留页面的部分内容(禁用缓存)。

假设整个页面都可以缓存,但页面右侧显示的 banner 除外。通过对 banner 使用 {insert} 函数,可以在缓存的内容中动态保留此元素。有关详细信息和示例,请参见 {insert} 的文档。

您可以通过 clearAllCache() 函数清除所有缓存文件,或者使用 clearCache() 函数清除各个缓存文件 和组

示例 15.5 清除缓存

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

$smarty->setCaching(Smarty::CACHING_LIFETIME_CURRENT);

// clear only cache for index.tpl
$smarty->clearCache('index.tpl');

// clear out all cache files
$smarty->clearAllCache();

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