隨筆-31  評論-257  文章-0  trackbacks-0
          緩存

                功能強大的應用程序一般都有很大的開銷,通常是數(shù)據(jù)獲取和處理操作帶來的。對于Web應用程序,這個問題是由于HTTP協(xié)議的無狀態(tài)性造成的。由于HTTP協(xié)議是無狀態(tài)的,對于每個頁面請求,都要重復地執(zhí)行相同的操作,而不論數(shù)據(jù)是否修改。要讓應用程序在世界范圍最大的網(wǎng)絡(luò)中可用,會使這個問題進一步惡化。所以,毫不奇怪,人們總在想方設(shè)法地讓Web應用程序運行得更高效。對此有一種特別有效的解決方案,這也是最合理的方案之一:將動態(tài)頁面轉(zhuǎn)換成靜態(tài)頁面,只有在頁面內(nèi)容有修改之后才重新構(gòu)建,或者定期地重新構(gòu)建。Smarty提供了這樣一個特性,一般稱為頁面緩存。
              如果要使用緩存,需要首先通過設(shè)置Smarty 的緩存屬性來啟用緩存,如下:
          1 <?php
          2   require("Smarty.class.php");
          3   $smarty = new Smarty;
          4   $smarty->caching = 1;
          5    $smarty->display("news.tpl");
          6 ?>

                啟用緩存后,調(diào)用 display() 和 fetch() 方法在指定模板 (由$cache_dir 屬性指定) 中保存目標模板的內(nèi)容。

              處理緩存生命期

                緩存的頁面在由 $cache_lifetime 屬性指定的生命期(以秒為單位)內(nèi)有效,默認為3600秒,即1小時。因此,如果希望修改此設(shè)置,就可以設(shè)置這個屬性,如下:
          1 <?php
          2     require("Smarty.class.php");
          3     $smarty = new Smarty;
          4     $smarty->caching = 1;
          5     //設(shè)置生命周期
          6    $smarty->cache_lifetime = 1800;
          7     $smarty->display("news.tpl");
          8 ?>

          在此對象的生命期內(nèi),后續(xù)調(diào)用和緩存的模板都使用此生命期。
              有可能需要覆蓋以前設(shè)置的緩存生命期,從而能分別控制每個模板的緩存生命期。通過將$caching 屬性設(shè)置為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 模板的生命期設(shè)置為20分鐘,它覆蓋了前面設(shè)置的全局生命期值。

          通過 is_cached( ) 消除處理開銷

              如前面所述,緩存模板還能消除處理開銷,如果禁用緩存(只啟用編譯),這些處理開銷總是會發(fā)生。但是,默認情況下并沒有啟用緩存。要啟用緩存,需要把處理指令放在 if 條件中,并執(zhí)行 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是否有效。如果有效,則跳過數(shù)據(jù)庫訪問,否則才訪問數(shù)據(jù)庫。

          為每個模板創(chuàng)建多個緩存
             
              任何指定的Smarty模板都可以用于為整個新聞項,博客項等提供一個通用界面。由于同一個模板用來生成不同數(shù)量的不同項,那么如何緩存一個模板的多個實例呢?答案比你想像的要簡單。Smarty的開發(fā)人員實際不已經(jīng)解決了這個問題,可以通過display()方法為緩存模板的每個實例指派一個唯一標識符。例如,假設(shè)有一個用生成用戶信息的模板,并希望緩存這個模板的各個實例:
           1 <?php
           2     require("Smarty.class.php");
           3     require("User.class.php");
           4 
           5     $smarty = new Smarty;
           6     $smarty->caching = 1;
           7 
           8     //根據(jù)不同的用戶ID來區(qū)分不同的用戶實例來判斷有沒有被緩存
           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       當顯示時也根據(jù)該用戶的ID來區(qū)分將哪個實例進行緩存,而不影響其它用戶的緩存
          18     即是用userid 值來區(qū)分同一個緩存模板的不同實例,所有用戶都共用一個模板,
          19     但信息都不盡相同,所以不能統(tǒng)一緩存,要獨立分開緩存
          20    */
          21     $smarty->display("userinfo.tpl",$_GEG['userid']);
          22 ?>

          特別注意下面一行:
              $smarty->display("userinfo.tpl",$_GEG['userid']);
          這一行對于此腳本有兩個功能,一方面獲取名為$_GET['userinfo'] 的 userinfo.tpl 緩存版本,另一方面,如果還不存在這個緩存,則用這個名字來緩存該模板實例。采用這種方式,可以輕松地為指定模板緩存任意數(shù)量的實例。

          關(guān)于緩存的結(jié)語

              模板緩存大大提升了應用程序的性能,如果決定將Smarty集成到工程中來,就應當認真地考慮緩存。但是,因為大多數(shù)強大的Web應用程序功能都體現(xiàn)在其動態(tài)性上,所以一方面要考慮到性能提升,另一方面也要考慮到緩存頁面隨時間是否仍有效,要在這二者之間進行權(quán)衡。
          posted on 2008-07-29 13:55 姜大叔 閱讀(222) 評論(0)  編輯  收藏 所屬分類: PHP
          主站蜘蛛池模板: 富锦市| 北安市| 夹江县| 佛冈县| 旌德县| 田东县| 晋宁县| 广宁县| 兴国县| 拜泉县| 三都| 东乡| 南阳市| 密山市| 榕江县| 公安县| 太谷县| 琼结县| 调兵山市| 扶沟县| 克拉玛依市| 凤庆县| 肇州县| 信丰县| 从化市| 伊宁县| 岢岚县| 宁都县| 舞钢市| 红安县| 五华县| 自贡市| 清水县| 新竹县| 隆化县| 澄江县| 平远县| 莱芜市| 乌兰察布市| 交城县| 保靖县|