Smarty 是什么?
为什么使用?
用例和工作流
语法对比
模板继承
最佳实践
速成教程
通过将调用输出保存到文件中来加速对 display()
或 fetch()
的调用。如果调用已缓存的版本,则显示该版本而不是重新生成输出。缓存可以极大地加快速度,尤其对于计算时间较长的模板。由于 display()
或 fetch()
的输出已缓存,因此一个缓存文件可能由几个模板文件、配置文件等组成。
由于模板是动态的,因此谨慎处理缓存的内容和缓存时间非常重要。例如,如果你要显示网站首页,其内容变化不大,则可以将此页面缓存一个小时或更长时间。另一方面,如果你要显示一个包含每分钟都有新信息的时刻表页面,则缓存此页面就没有意义。
首先,要启用缓存,需将 $caching
设置为 Smarty::CACHING_LIFETIME_CURRENT
或 Smarty::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'); ?>