程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 《PHP與MySQL程序設計(第3版)》——19.8 緩存

《PHP與MySQL程序設計(第3版)》——19.8 緩存

編輯:MySQL綜合教程

功能強大的應用程序一般都有很大的開銷,通常是數據獲取和處理操作帶來的。對於Web應用程序,這個問題是由於HTTP協議的無狀態性造成的。由於HTTP協議是無狀態的,對於每個頁面請求,都要重復地執行相同的操作,而不論數據是否修改。要讓應用程序在世界范圍最大的網絡中可用,會使這個問題進一步惡化。所以,毫不奇怪,人們總在想方設法地讓Web應用程序運行得更高效。對此有一種特別有效的解決方案,這也是最合理的方案之一:將動態頁面轉換為靜態頁面,只有在頁面內容有修改後才重新構建,或者定期地重新構建。Smarty提供了這樣一個特性,一般稱為頁面緩存(page caching)。本節將介紹這個特性,並提供幾個使用示例。

注解   “緩存”與“編譯”在兩個方面有所不同。首先,雖然“編譯”通過將模板轉換為PHP腳本而減少了開銷,但仍要在邏輯層執行獲取數據所需的動作。“緩存”則在這兩個層次上都減少了開銷,不再需要在邏輯層反復地執行命令,另外還將模板內容轉換為靜態頁面。其次,“編譯”在默認情況下是啟用的,而“緩存”必須由開發人員顯式開啟。

如果要使用緩存,需要首先通過設置Smarty的緩存屬性來啟用緩存,如下:

啟用緩存後,調用display()fetch()方法在指定模板(由$cache_dir屬性指定)中保存目標模板的內容。

19.8.1  處理緩存生命期

緩存的頁面在由$cache_lifetime屬性指定的生命期(以秒為單位)內有效,默認為3600秒,即1小時。因此,如果希望修改此設置,就可以設置這個屬性,如下:

在此對象的生命期內,後續調用和緩存的模板都使用此生命期。

有可能需要覆蓋以前設置的緩存生命期,從而能分別控制每個模板的緩存生命期。通過將$caching屬性設置為2就可以做到這一點,如下:

在這裡,news.tpl模板的生命期設置為20分鐘,它覆蓋了前面設置的全局生命期值。

19.8.2  通過is_cached()消除處理開銷

如本章前面所述,緩存模板還能消除處理開銷,如果禁用緩存(只啟用編譯),這些處理開銷總是會發生。但是,默認情況下並沒有啟用緩存。要啟用緩存,需要把處理指令放在if條件中,並執行is_cached()方法,如下:

在這個例子中,將首先驗證模板news.tpl是否有效。如果有效,則跳過數據庫訪問,否則執行數據庫訪問。

19.8.3  為每個模板創建多個緩存

任何指定的Smarty模板都可以用於為整個系列教程、新聞項、博客項等提供一個通用界面。由於同一個模板用來生成不同數量的不同項,那麼如何緩存一個模板的多個實例呢?答案比你想象的要簡單。Smarty的開發人員實際上已經解決了這個問題,可以通過display()方法為緩存模板的每個實例指派一個唯一標識符。例如,假設有一個用於生成專業拳擊手傳記的模板,並希望緩存這個模板的各個實例:

特別要注意下面一行:

這一行對於此腳本有兩個功能,一方面獲取名為$_GET["boxerid"]boxerbio.tpl緩存版本,另一方面,如果還不存在這個緩存,則用這個名字來緩存該模板實例。采用這種方式,可以輕松地為指定模板緩存任意數量的實例。

19.8.4  關於緩存的結束語

模板緩存大大提升了應用程序的性能,如果決定將Smarty集成到工程中來,就應當認真地考慮緩存。但是,因為大多數強大的Web應用程序功能都體現在其動態特性上,所以一方面要考慮到性能提升,另一方面也要考慮到緩存頁面隨時間是否仍有效,要在這二者之間進行權衡。通過本小節的學習,你了解了如何分別管理每個頁面的緩存生命期,以及基於特定緩存的有效性來執行邏輯層的某些部分。要確保對每個模板都考慮到這些特性。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved