瀏覽器緩衝,就完全不是那麼回事了,緩衝內容儲存在瀏覽器本地,而內容卻由web伺服器產生,任何一方都不可能獨立完成這一系統過程,所以它們之間必須有一種溝通機制,這就是http中的“緩衝協商”。
我們先來看一個通常的http請求:
host www.111cn.net
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。