缓存
功能强大的应用程序一般都有很大的开销,通常是数据获取和处理操作带来的。对于Web应用程序,这个问题是由于HTTP协议的无状态性造成的。由于HTTP协议是无状态的,对于每个页面请求,都要重复地执行相同的操作,而不论数据是否修改。要让应用程序在世界范围最大的网络中可用,会使这个问题进一步恶化。所以,毫不奇怪,人们总在想方设法地让Web应用程序运行得更高效。对此有一种特别有效的解决方案,这也是最合理的方案之一:将动态页面转换成静态页面,只有在页面内容有修改之后才重新构建,或者定期地重新构建。Smarty提供了这样一个特性,一般称为页面缓存。
如果要使用缓存,需要首先通过设置Smarty 的缓存属性来启用缓存,如下:
1 <?php
2 require("Smarty.class.php");
3 $smarty = new Smarty;
4 $smarty->caching = 1;
5 $smarty->display("news.tpl");
6 ?>
启用缓存后,调用 display() 和 fetch() 方法在指定模板 (由$cache_dir 属性指定) 中保存目标模板的内容。
处理缓存生命期
缓存的页面在由 $cache_lifetime 属性指定的生命期(以秒为单位)内有效,默认为3600秒,即1小时。因此,如果希望修改此设置,就可以设置这个属性,如下:
1 <?php
2 require("Smarty.class.php");
3 $smarty = new Smarty;
4 $smarty->caching = 1;
5 //设置生命周期
6 $smarty->cache_lifetime = 1800;
7 $smarty->display("news.tpl");
8 ?>
在此对象的生命期内,后续调用和缓存的模板都使用此生命期。
有可能需要覆盖以前设置的缓存生命期,从而能分别控制每个模板的缓存生命期。通过将$caching 属性设置为2就可以做到这一点,如下:
1 <?php
2 require("Smarty.class.php");
3 $smarty = new Smarty;
4 $smarty->caching = 2;
5 $smarty->cache_lifetime = 1200;
6 $smarty->display("news.tpl");
7 ?>
在这里,news.tpl 模板的生命期设置为20分钟,它覆盖了前面设置的全局生命期值。
通过 is_cached( ) 消除处理开销
如前面所述,缓存模板还能消除处理开销,如果禁用缓存(只启用编译),这些处理开销总是会发生。但是,默认情况下并没有启用缓存。要启用缓存,需要把处理指令放在 if 条件中,并执行 is_cached( )方法,如下:
1 <?php
2 require("Smarty.class.php");
3 $smarty = new Smarty;
4 $smarty->caching = 1;
5
6 if (! $smarty->is_cached("news.tpl")){
7 $conn = mysql_connect("localhost","name","pwd");
8 $db = mysql_select_db("news");
9 $query = "select * from news";
10
11 }
12 $smarty->display("news.tpl");
13 ?>
在这个例子中,将首先验证模板news.tpl是否有效。如果有效,则跳过数据库访问,否则才访问数据库。
为每个模板创建多个缓存
任何指定的Smarty模板都可以用于为整个新闻项,博客项等提供一个通用界面。由于同一个模板用来生成不同数量的不同项,那么如何缓存一个模板的多个实例呢?答案比你想像的要简单。Smarty的开发人员实际不已经解决了这个问题,可以通过display()方法为缓存模板的每个实例指派一个唯一标识符。例如,假设有一个用生成用户信息的模板,并希望缓存这个模板的各个实例:
1 <?php
2 require("Smarty.class.php");
3 require("User.class.php");
4
5 $smarty = new Smarty;
6 $smarty->caching = 1;
7
8 //根据不同的用户ID来区分不同的用户实例来判断有没有被缓存
9 if(! is_cached("userinfo.tpl",$_GET['userid'])){
10 $user = new User();
11
12 $smarty->assign("name",$user->getName());
13 $smarty->assign("address",$user->getAddress());
14 }
15
16 /*
17 当显示时也根据该用户的ID来区分将哪个实例进行缓存,而不影响其它用户的缓存
18 即是用userid 值来区分同一个缓存模板的不同实例,所有用户都共用一个模板,
19 但信息都不尽相同,所以不能统一缓存,要独立分开缓存
20 */
21 $smarty->display("userinfo.tpl",$_GEG['userid']);
22 ?>
特别注意下面一行:
$smarty->display("userinfo.tpl",$_GEG['userid']);
这一行对于此脚本有两个功能,一方面获取名为$_GET['userinfo'] 的 userinfo.tpl 缓存版本,另一方面,如果还不存在这个缓存,则用这个名字来缓存该模板实例。采用这种方式,可以轻松地为指定模板缓存任意数量的实例。
关于缓存的结语
模板缓存大大提升了应用程序的性能,如果决定将Smarty集成到工程中来,就应当认真地考虑缓存。但是,因为大多数强大的Web应用程序功能都体现在其动态性上,所以一方面要考虑到性能提升,另一方面也要考虑到缓存页面随时间是否仍有效,要在这二者之间进行权衡。
posted on 2008-07-29 13:55
姜大叔 阅读(215)
评论(0) 编辑 收藏 所属分类:
PHP