Chapter 15. 缓存

通过将输出内容保存到文件内,缓存机制可以用来加速 display() 或者fetch()的执行。 如果缓存被开启,那么显示时缓存的输出将替代重新生成显示内容的操作。 缓存可以极大提高程序的执行速度,尤其当模板需要很长的计算时间的情况下。 当display() 或者 fetch()开启缓存, Smarty将生成对应的缓存文件,缓存文件包含了多个模板文件的内容,配置文件内容等等。

当页面是动态的内容,那么必须谨慎考虑你的缓存和缓存时间。 比如说,你的网站首页通常不会更新得太快,那么可以将其缓存一个小时或者更多,以便加速其显示。 从另一方面讲,如果你的页面上有按秒来显示新内容的功能,那么该页面就不应该被缓存。

配置缓存时间

缓存可以通过设置 $caching为:Smarty::CACHING_LIFETIME_CURRENTSmarty::CACHING_LIFETIME_SAVED来开启。


Example 15.1. 开启缓存

  1. <?php
  2. require('Smarty.class.php');
  3. $smarty = new Smarty;
  4.  
  5. // 使用$smarty->cacheLifetime()可以更精确定义缓存时间
  6.  
  7. $smarty->setCaching(Smarty::CACHING_LIFETIME_CURRENT);
  8.  
  9. $smarty->display('index.tpl');
  10. ?>
  11.  

开启了缓存,调用display('index.tpl') 会正常渲染模板,但也会保存一份输出的内容到$cache_dir目录下的文件中(缓存副本)。在下一次调用display('index.tpl'),缓存文件会替代渲染模板的过程。

技术说明

$cache_dir下的文件,文件名与模板名称相似。虽然这些文件也有.php 后缀,但它们不会被直接执行。请不要编辑这些文件!

每个缓存页面都有一个缓存过期时间$cache_lifetime。默认是3600秒,也就是一小时。当超过了此时间,缓存将被重新生成。当设置$cachingSmarty::CACHINGLIFETIME_SAVED时,可以给每个缓存设置其单独的缓存时间。 参见[$cachelifetime]($91.md)。


Example 15.2. 为每个缓存设置$cache_lifetime

  1. <?php
  2. require('Smarty.class.php');
  3. $smarty = new Smarty;
  4.  
  5. // 让每个缓存的过期时间都可以在display执行前单独设置。
  6. $smarty->setCaching(Smarty::CACHING_LIFETIME_SAVED);
  7.  
  8. // 设置index.tpl的过期时间为5分钟
  9. $smarty->setCacheLifetime(300);
  10. $smarty->display('index.tpl');
  11.  
  12. // 设置home.tpl的过期时间为1小时
  13. $smarty->setCacheLifetime(3600);
  14. $smarty->display('home.tpl');
  15.  
  16. // 注意:当$caching设置了Smarty::CACHING_LIFETIME_SAVED后,
  17. // 下面的$cache_lifetime将不会起效。
  18. // home.tpl已经设置了过期时间为1小时,
  19. // 所以不会再遵循下面的$cache_lifetime值,
  20. // home.tpl的过期时间还是1小时。
  21. $smarty->setCacheLifetime(30); // 30 秒
  22. $smarty->display('home.tpl');
  23. ?>
  24.  

$compile_check开启的时候(默认开启),每个模板文件和配置文件都会在缓存检查的时候执行编译检查。如果这些文件在缓存生成后被修改,那么缓存会马上重新生成。 这是一个覆盖的选项,所以更好的性能建议把$compile_check设置成false。


Example 15.3. 关闭 $compile_check

  1. <?php
  2. require('Smarty.class.php');
  3. $smarty = new Smarty;
  4.  
  5. $smarty->setCaching(Smarty::CACHING_LIFETIME_CURRENT);
  6. $smarty->setCompileCheck(false);
  7.  
  8. $smarty->display('index.tpl');
  9. ?>
  10.  

如果开启了$force_compile,缓存文件将总是会重新生成。效果和关闭缓存是一样的,而且还会降低性能。 $force_compile一般用于 调试的目的。更确当的方式是把缓存$caching设置成Smarty::CACHING_OFF。

isCached()函数可以检查模板的缓存是否存在。如果你的模板是需要读取某些数据(如数据库),那么你可以用它来跳过这个过程。


Example 15.4. 使用 isCached()

  1. <?php
  2. require('Smarty.class.php');
  3. $smarty = new Smarty;
  4.  
  5. $smarty->setCaching(Smarty::CACHING_LIFETIME_CURRENT);
  6.  
  7. if(!$smarty->isCached('index.tpl')) {
  8. // 找不到缓存,这里进行一些赋值操作
  9. $contents = get_database_contents();
  10. $smarty->assign($contents);
  11. }
  12.  
  13. $smarty->display('index.tpl');
  14. ?>
  15.  

你可以使用{nocache}{/nocache}来设置页面上部分区块是动态的(不缓存),同样你也可以使用{insert}函数,或者nocache参数来达到同样目的。

比如说我们希望把整个页面缓存,除了页面两边显示的banner广告。 那么我们可以用{insert}来显示banner广告, 这样就可以在缓存的内容里面,保存广告部分的动态效果。参见 {insert}的详细文档。

你可以通过clearAllCache()来删除全部缓存,或者用clearCache() 来删除特定的缓存组的缓存内容。


Example 15.5. 删除缓存

  1. <?php
  2. require('Smarty.class.php');
  3. $smarty = new Smarty;
  4.  
  5. $smarty->setCaching(Smarty::CACHING_LIFETIME_CURRENT);
  6.  
  7. // 仅删除index.tpl的缓存
  8. $smarty->clearCache('index.tpl');
  9.  
  10. // 删除全部缓存
  11. $smarty->clearAllCache();
  12.  
  13. $smarty->display('index.tpl');
  14. ?>
  15.  

原文: https://www.smarty.net/docs/zh_CN/caching.tpl