What is Smarty?
Why use it?
Use Cases and Work Flow
Syntax Comparison
Template Inheritance
Best Practices
Crash Course
You may use the Smarty logo according to the trademark notice.
For sponsorship, advertising, news or other inquiries, contact us at:
通过将输出内容保存到文件内,缓存机制可以用来加速
display()
或者fetch()
的执行。
如果缓存被开启,那么显示时缓存的输出将替代重新生成显示内容的操作。
缓存可以极大提高程序的执行速度,尤其当模板需要很长的计算时间的情况下。
当display()
或者
fetch()
开启缓存,
Smarty将生成对应的缓存文件,缓存文件包含了多个模板文件的内容,配置文件内容等等。
当页面是动态的内容,那么必须谨慎考虑你的缓存和缓存时间。 比如说,你的网站首页通常不会更新得太快,那么可以将其缓存一个小时或者更多,以便加速其显示。 从另一方面讲,如果你的页面上有按秒来显示新内容的功能,那么该页面就不应该被缓存。
缓存可以通过设置
$caching
为:Smarty::CACHING_LIFETIME_CURRENT
或 Smarty::CACHING_LIFETIME_SAVED
来开启。
Example 15.1. 开启缓存
<?php require('Smarty.class.php'); $smarty = new Smarty; // 使用$smarty->cacheLifetime()可以更精确定义缓存时间 $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
。
Example 15.2. 为每个缓存设置$cache_lifetime
<?php require('Smarty.class.php'); $smarty = new Smarty; // 让每个缓存的过期时间都可以在display执行前单独设置。 $smarty->setCaching(Smarty::CACHING_LIFETIME_SAVED); // 设置index.tpl的过期时间为5分钟 $smarty->setCacheLifetime(300); $smarty->display('index.tpl'); // 设置home.tpl的过期时间为1小时 $smarty->setCacheLifetime(3600); $smarty->display('home.tpl'); // 注意:当$caching设置了Smarty::CACHING_LIFETIME_SAVED后, // 下面的$cache_lifetime将不会起效。 // home.tpl已经设置了过期时间为1小时, // 所以不会再遵循下面的$cache_lifetime值, // home.tpl的过期时间还是1小时。 $smarty->setCacheLifetime(30); // 30 秒 $smarty->display('home.tpl'); ?>
当
$compile_check
开启的时候(默认开启),
每个模板文件和配置文件都会在缓存检查的时候执行编译检查。
如果这些文件在缓存生成后被修改,那么缓存会马上重新生成。
这是一个覆盖的选项,所以更好的性能建议把
$compile_check
设置成false。
Example 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()
函数可以检查模板的缓存是否存在。
如果你的模板是需要读取某些数据(如数据库),
那么你可以用它来跳过这个过程。
Example 15.4. 使用 isCached()
<?php require('Smarty.class.php'); $smarty = new Smarty; $smarty->setCaching(Smarty::CACHING_LIFETIME_CURRENT); if(!$smarty->isCached('index.tpl')) { // 找不到缓存,这里进行一些赋值操作 $contents = get_database_contents(); $smarty->assign($contents); } $smarty->display('index.tpl'); ?>
你可以使用{nocache}{/nocache}
来设置页面上部分区块是动态的(不缓存),
同样你也可以使用
{insert}
函数,或者nocache
参数来达到同样目的。
比如说我们希望把整个页面缓存,除了页面两边显示的banner广告。
那么我们可以用{insert}
来显示banner广告,
这样就可以在缓存的内容里面,保存广告部分的动态效果。
参见
{insert}
的详细文档。
你可以通过clearAllCache()
来删除全部缓存,或者
用clearCache()
来删除特定的缓存组
的缓存内容。
Example 15.5. 删除缓存
<?php require('Smarty.class.php'); $smarty = new Smarty; $smarty->setCaching(Smarty::CACHING_LIFETIME_CURRENT); // 仅删除index.tpl的缓存 $smarty->clearCache('index.tpl'); // 删除全部缓存 $smarty->clearAllCache(); $smarty->display('index.tpl'); ?>