随笔-31  评论-257  文章-0  trackbacks-0
缓存

      功能强大的应用程序一般都有很大的开销,通常是数据获取和处理操作带来的。对于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 姜大叔 阅读(214) 评论(0)  编辑  收藏 所属分类: PHP

只有注册用户登录后才能发表评论。


网站导航: