1. 程式人生 > >http快取機制

http快取機制

web伺服器通過http傳送欄位可以指定瀏覽器快取

HTTP 1.0 中的 Expires 是1.0中指定的瀏覽器快取時間

HTTP 1.1 中的Cache-Control 指定瀏覽器快取時間

瀏覽器會將請求內容儲存到本地,以url為key內容為content儲存

若指定瀏覽器快取時間,瀏覽器會通過檢測 Expires / Cache-Control 與Date(收到內容快取的時間),快取過期會發送請求到web伺服器

Cache-Control 的值可以有以下:

Public指示響應可被任何快取區快取。
Private指示對於單個使用者的整個或部分響應訊息,不能被共享快取處理。這允許伺服器僅僅描述當用戶的部分響應訊息,此響應訊息對於其他使用者的請求無效。
no-cache指示請求或響應訊息不能快取
no-store用於防止重要的資訊被無意的釋出。在請求訊息中傳送將使得請求和響應訊息都不使用快取。
max-age指示客戶機可以接收生存期不大於指定時間(以秒為單位)的響應。
min-fresh指示客戶機可以接收響應時間小於當前時間加上指定時間的響應。
max-stale指示客戶機可以接收超出超時期間的響應訊息。如果指定max-stale訊息的值,那麼客戶機可以接收超出超時期指定值之內的響應訊息。

常用max-age:num_sec 指定快取時間

Cache-Control 與 Last-Modified/If-Modified-Since 結合使用

設定 Last-Modified到瀏覽器,瀏覽器儲存這個值,這個值是檔案最後一次改動的時間,時間格式為GMT

當Cache-Control 指定的快取時間過期後 瀏覽器傳送 請求頭 If-Modified-Since 是這個最後修改時間

web伺服器可以自己判斷檔案是否過期選擇傳送 200還是304(強制瀏覽器使用本地快取)

判斷程式碼:

// 根據檔案修改時間判斷
$mtime = filemtime(__FILE__); // 檔案修改時間
if(array_key_exists('HTTP_IF_MODIFIED_SINCE', $_SERVER)&&strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])>=$mtime) //對比檔案修改時間
{
	header('HTTP/1.1 304 Not Modified');
}
header("Cache-Control: max-age=10");
header("Last-Modified: ".gmdate('l, d F Y H:i:s',$mtime).' GMT');

Cache-Control與 Etag/If-None-Match 結合使用  (優先順序高於Last-Modified/If-Modified-Since)

傳送ETag到瀏覽器,瀏覽器儲存值,這個值可以自己設定,預設Apache中,ETag的值,預設是對檔案的索引節(INode),大小(Size)和最後修改時間(MTime)進行Hash後得到的

當Cache-Control 指定的快取時間過期後 瀏覽器傳送 請求頭 If-None-Match 這個是瀏覽器得到的ETag
web伺服器可以自己判斷檔案是否過期選擇傳送 200還是304(強制瀏覽器使用本地快取)

判斷程式碼:(這裡使用的是sha1_file 判斷檔案是否修改)

// 根據tag判斷是否快取
$tag = sha1_file(__FILE__);
if(array_key_exists('HTTP_IF_NONE_MATCH', $_SERVER)&&$_SERVER['HTTP_IF_NONE_MATCH']==$tag) //對比檔案修改時間
{
	header('HTTP/1.1 304 Not Modified');
}
header("Cache-Control: max-age=10");
header("ETag: ".$tag);

總結:

Date 是瀏覽器獲取資料(http 200)的時間,這也是瀏覽器生成本地快取的時間

Expires 指定瀏覽器快取時間 http1.0

Cache-Control 指定瀏覽器快取時間 http1.1 優先順序比 Expires高且可設定項更多

Last-Modified/If-Modified-Since與Etag/If-None-Match

後者的優先順序高,都是在瀏覽器快取時間過期後會傳送頭資訊到web伺服器,是否304由web伺服器端自行處理

ETag更靈活,Last-Modified 只能設定GMT格式的時間

使用者的操作對快取的影響:

使用者操作

Expires/Cache-Control

Last-Modified/Etag

位址列回車

有效

有效

頁面連結跳轉

有效

有效

新開視窗

有效

有效

前進、後退

有效

有效

F5重新整理

無效

有效

Ctrl+F5重新整理

無效

無效


參考:

http://blog.csdn.net/czp11210/article/details/37693553

http://blog.csdn.net/dinglang_2009/article/details/38142641