轉自CSDN ouyang-web之路
原文鏈接:https://blog.csdn.net/cangqiong_xiamen/article/details/90405555
一.瀏覽器的緩存
status 為 200
Size為 from cache
200 from cache: 直接從本地緩存中獲取響應,最快速,最省流量, 因為根本沒有向服務器發送請求
304 Not Modified:協商緩存,瀏覽器在本地沒有生命中的情況下請求頭中發送一定的效驗數據到服務端,如果服務端數據沒有改變瀏覽器從本地緩存響應,返回304
快速,發送的數據很少,只返回一些基本的響應頭信息,數據量很小,不發送實際響應體
瀏覽器向服務器緩存是否更新了,是否還能繼續用
200 OK: 以上兩種緩存全都失敗,服務器返回完整響應。沒有用到緩存,相對最慢。
瀏覽器認為本地緩存可以使用,是不會去請求服務端的
二.獲取請求頭
Curl -I 參數I為只獲取請求頭信息
[root@localhost ~]# curl -I www.baidu.com
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Connection: Keep-Alive
Content-Length: 277
Content-Type: text/html
Date: Mon, 20 May 2019 05:28:13 GMT
Etag: “575e1f72-115”
Last-Modified: Mon, 13 Jun 2016 02:50:26 GMT
Pragma: no-cache
Server: bfe/1.0.8.18
Cache-Control: 運用Cache-Control告知瀏覽器緩存過期的時間間隔而不是時刻,即使具體時間不一致,也不影響緩存的管理
no-store 禁止瀏覽器緩存響應
no-cache 不允許直接使用本地緩存,先發起請求和服務器協商
max-age=delta-seconds: 告知瀏覽器該響應本地緩存有效的最長期限,以秒為單位
Last-Modified: 通知瀏覽器資源的最后修改時間
Last-Modified: Mon,28 Sep 2015 08:06:43 GMT
Pragma: HTTP1.0時代的遺留產物,該字段被設置為no-cache時,會告知瀏覽器禁用本地緩存,即每次都向服務器發送請求
ETag: HTTP1.1推出的,文件的指紋標識符,如果文件內容修改,指紋會改變
Etag:“78437822c-6739”
If-Modified-Since: 得到資源的最后修改時間后,會將這個信息通過If-Modified-Since提交到服務器做檢查,如果沒有修改,返回304狀態碼
Connection:keep-alive 表示是否需要持久連接(HTTP 1.1默認進行持久連接) Keep-Alive表示持久連接
三.使用請求頭來處理瀏覽器緩存
實現效果: 用戶請求時瀏覽器緩存一個小時,一個小時后文件獲取
一個小時內文件,瀏覽器使用本地緩存
<?php ini_set('date.timezone','Asia/Shanghai');
//獲取瀏覽器最后緩存修改的時間
$since = isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])? $_SERVER['HTTP_IF_MODIFIED_SINCE'] : 0;
$lifetime = 3600;
//判斷文件是否過期
if ($since && (strtotime($since) + $lifetime > time()))
{
header('HTTP/1.1 304 Not Modified'); //使用本地緩存
exit;
}
//告訴瀏覽器資源最新修改時間
header('Last-Modified:'.gmdate('D, d M Y H:i:s',time()).'GMT');
echo time();