程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> php 浏覽器緩存

php 浏覽器緩存

編輯:關於PHP編程

浏覽器緩存,就完全不是那麼回事了,緩存內容存儲在浏覽器本地,而內容卻由web服務器生成,任何一方都不可能獨立完成這一系統過程,所以它們之間必須有一種溝通機制,這就是http中的“緩存協商”。
我們先來看一個通常的http請求:
host         www.bkjia.com
user-agent         mozilla/5.0 (windows; u; windows nt 6.1; zh-cn; rv:1.9.2.9) gecko/20100824 firefox/3.6.9        firephp教程/0.4
accept         text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
accept-language         zh-cn,zh;q=0.5
accept-encoding         gzip,deflate
accept-charset         gb2312,utf-8;q=0.7,*;q=0.7
keep-alive         115
connection         keep-alive
上面就是一個普通的http請求,為了實現在浏覽器緩存控制,我們需要了解http響應頭中的四種標記:
last-modified:最後修改gmt時間
etag:通過一串編碼來標記內容是否更改過
expires:指定一個過期gmt時間
cache-control:mag-age=相對於浏覽器本地的過期秒數(可避免服務器時間不正確的情況下同樣起作用)

http返回的狀態代碼:
200——請求成功
304——客戶端已經執行了get,但文件未變化
400——錯誤請求,如語法錯誤
500——服務器產生內部錯誤
501——服務器不支持請求的函數

以下代碼使用了以上四種方法來控制浏覽器內容緩存一個小時,如果在一小時之內則立即返回304狀態碼通知浏覽器使用本地的內容。這將節省服務器程序執行時間,網絡傳輸時間(僅返回一個頭文件)
$modified_time = $_server['http_if_modified_since'];
if (strtotime($modified_time) + 3600 > time()) {
header("http/1.1 304");
exit(0);
}
header("last-modified:" . gmdate("d, d m y h:i:s") . "gmt");
header("expires:" . gmdate("d, d m y h:i:s", time() + 3600) . "gmt");
header("cache-control: max-age=3600");

特別需要說明一下的是:expires需要服務器商支持expires模塊默認情況下是不會開啟,使用以下命令即可:
a2enmod expires         //啟用expires模塊
/etc/init.d/apache2 restart        //重啟apache服務
我們還可以通過修改http.conf配置中:
expiresactive        on expiresbytype image/gif “access plus 1 month” expiresbytype text/css教程 “now plus 2 day” expiresdefault         “now plus 1 day”
以上是針對靜態內容的mime類型來設置過期時間,因為我們無法給靜態文件直接指定一個絕對到期時間,所以采用”access plus”式的語法,由web服務器在該內容被請求的時候動態計算一個絕對到期時間,作為expires標記的內容。
值得一提的是,對於常見的靜態文件格式,即便是web服務器返回http響應頭中沒有expires標記,浏覽器也會根據一些其它線索猜測一個過期時間,比如ie在某種緩存模式下,對於gif圖片設置為永不過期,除非我們配置expires為馬上過期,也就是將過期時間設置為當前時間或者0。


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