緩衝的主要作用是防止使用者頻繁重新整理網站頁面,導致伺服器資料庫負擔,既要保證資訊更新的及時性,也要保證緩衝能被充分利用。
http協議裡控制瀏覽器緩衝的頭有三個Cache-Control,Expires,Last-Modified,在PHP下控制請求頁面的瀏覽器緩衝主要是利用php的 header()函數進行設定的。
下面來瞭解一下這三個http協議裡面控制緩衝頭的含義以及如何使用php設定這三種頭標的方式吧!
(1)Cache-Control:即緩衝控制,指定請求和響應遵循的緩衝機制。在請求訊息或響應訊息中設定Cache-Control並不會修改另一個訊息處理過程中的緩衝處理過程。 請求時的緩衝指令有 no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached等,響應訊息中的指令有 public、private、no-cache、no-store、no-transform、must-revalidate、 proxy-revalidate、max-age。
各個訊息中的部分指令含義如下:
Public:指示響應可被任何緩衝區緩衝。
Private:指示對於單個使用者的整個或部分響應訊息,不能被共用快取處理。這允許伺服器僅僅描述當使用者的部分響應訊息,此響應訊息對於其他使用者的請求無效。
no-cache:指示請求或響應訊息不能緩衝
no-store:用於防止重要的資訊被無意的發布。在請求訊息中發送將使得請求和響應訊息都不使用緩衝。
max-age:指示客戶機可以接收生存期不大於指定時間(以秒為單位)的響應。
min-fresh:指示客戶機可以接收回應時間小於目前時間加上指定時間的響應。
max-stale:指示客戶機可以接收超出逾時期間的響應訊息。如果指定max-stale訊息的值,那麼客戶機可以接收超出逾時期指定值之內的響應訊息。注意:Cache-Control 頭標是在HTTP1.1裡添加的,相對於其他幾種方式能夠實現更細緻的緩衝控制。
php設定 Cache_Control 頭標範例程式碼如下:
header('Cache-Control: max-age=3600*24');//緩衝1天,表示最大生存期是1天,超過1天瀏覽器必須去伺服器重新讀取,這個時間是從使用者第一次讀取頁面時開始計時的
(2)Expires:緩衝到期的絕對時間(格林威治標準時間)。如果過了它指定的那個時間點,瀏覽器就不認緩衝了,就會去伺服器重新請求一份最新的。php設定 Expires 頭標範例程式碼如下:header('Expires: Mon, 29 Jan 2007 08:56:01 GMT');//指定到期時間,注意這裡使用的是格林威治標準時間擷取格林威治標準時間可使用函數gmdate,具體用法可參考相關文檔。
(3)Last-Modified:文檔的最後修改時間。
它的用法就是:
1:如果是靜態檔案,用戶端會發上來它緩衝裡的時間,apache會來比對,如果發現沒有修改就直接返回一個頭,狀態代碼是304,位元組數非常少。
2:如果是php動態檔案,用戶端發上比對時間,php會判斷是否修改,如果修改時間相同,就只會返回1024位元組,至於為什麼返回1024不得而知,如果你的php產生的檔案非常大,它也只返回1024,所以比較省頻寬,用戶端會根據伺服器端發過來的修改時間自動從快取檔案裡顯示。注意:如果沒有設定Last-Modified頭,只設定了Cache-Control和Expires也是可以起作用的,但每次請求要返回真實的檔案位元組數,而不是1024php設定 Last-Modified 頭標範例程式碼如下:
header('Last-Modified: '.gmdate('D, d M Y 01:01:01',$time).' GMT');//使用的是格林尼治時間,$time是指檔案添加時候的時間戳記下面發一個完整的通過php控制請求頁面瀏覽器緩衝的樣本:
echo '這是一個緩衝測試!';
$time=time();
$interval=3600*12;//12小時
header('Last-Modified: '.gmdate('r',$time));
header('Expires: '.gmdate('r',($time+$interval)));
header('Cache-Control: max-age='.$interval);
另外分析一下重新整理,轉到以及強制重新整理的區別,瀏覽器上有重新整理和轉到按鍵,有的瀏覽器支援用ctrl+F5強制重新整理頁面,它們的區別是什嗎?
恐怕知道的人不多吧!其實這三種動作完全可以用上面這三種頭標進行解釋。轉到:使用者點選連結就是轉到,它完全使用緩衝機制,如果有Last-Modified那麼不會和伺服器通訊,用抓包工具可以查看到發送位元組是0byte,如果緩衝到期,那麼它會執行F5重新整理的動作。重新整理(F5):這種重新整理也是根據緩衝是否有Last-Modified來決定,如果有會轉入304或1024(php),如果沒有最後更新時間那麼去伺服器讀取,返回真實文檔大小。強制重新整理(ctrl+F5):完全拋棄緩衝機制,去伺服器讀取最新文檔,向伺服器發送的header如:Cache-Control: no-cache 指令。