瀏覽器緩存主要有兩類
緩存協商:Last-midified ,Etag
完全緩存:cache-control,Expires
緩存協商的意思是須要去服務器端詢問頁面有沒有修改過,沒有修改過則返回304直接使用緩存內容,不然返回新內容
協商步驟:
php
服務器發送帶Last-midified:GMTtime 頭的http response瀏覽器
瀏覽器下次請求時帶上if-modified-since:GMTtime http 請求頭緩存
服務端用本地Last-midified時間與if-modified-since比較,計算瀏覽器數據是否過時併發送響應服務器
last-midified示例:併發
<?php
$modified_time = @$_SERVER['HTTP_IF_MODIFIED_SINCE'];
if( strtotime($modified_time) + 3600>time() ){
header('HTTP/1.1 304');
exit;
}
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
echo time();
?>工具
Etag的工做原理與Last-midified相似,不一樣點在於Etag的值是用戶可自定義的
緩存協商可應用在動態頁面且實時性不是特別強的頁面,如網站首頁
完全緩存
完全緩存的意思是在緩存失效以前再也不須要跟服務器交互
經常使用的是Expires,Expires的值是一個絕對時間,由服務器產生
這兒存在一個問題,就是服務器的時間可能給客戶端的時間不一致致使緩存時間的誤差
要解決這個問題就要使用cache-control,它保存的是一個相對瀏覽器的時間
若是同時存在cache-control和Expires怎麼辦呢?
瀏覽器老是優先使用cache-control,若是沒有cache-control才考慮Expires
瀏覽器緩存最大的價值是節省了帶寬
爲何沒有提升吞吐率呢? 下面來分析一下
這裏分兩種狀況:靜態頁面和動態頁面
服務端加載靜態頁面須要進行磁盤IO,瀏覽器緩存則可節省這部分時間,不過服務器通常會用squid等工具進行緩存,因此靜態資源在提升吞吐率方面效果不明顯
再來看一看動態資源
動態資源也分爲兩類:實時動態和準實時動態
實時動態是不能用瀏覽器緩存的
準實時動態頁面可節省磁盤IO和計算時間,可是讓瀏覽器緩存的時間不可過久,且在本地重複訪問的機率也不大
因此說動態內容在提升吞吐率方面效果也不明顯
對於準實時動態頁面卻是能夠緩存在服務端,如squid
網站