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