我們往往在伺服器上對快取設定進行各種優化方案,但是我們卻很少注意到客戶端快取,準確的說是瀏覽器的快取機制。
其實每種瀏覽器都有快取策略,會暫時將每乙個瀏覽過的檔案快取在乙個特殊的資料夾裡。我們就可以在使用者重複提交頁面請求的時候,告訴使用者這個頁 面沒有改變,可以呼叫快取。 那我們怎麼知道使用者有沒有這個頁面的快取資料呢? 其實瀏覽器在傳送請求的時候會先傳送http頭,一般象這樣:
date: sun, 30 jul 2006 09:18:11 gmt
content-type: image/gif
last-modified: wed, 19 jul 2006 07:40:06 gmt
etag: "8c55da8d6abc61:2327"
content-length: 14757 其中
last-modified: wed, 19 jul 2006 07:40:06 gmt
etag: "8c55da8d6abc61:2327"
就是有關頁面的快取資訊的。然後如果伺服器返回的響應**不是http 200 (ok),而是 304的話,瀏覽器就會從快取中讀取資料。
//告訴客戶端瀏覽器不使用快取,http 1.1 協議
header("cache-control: no-cache, must-revalidate");
//告訴客戶端瀏覽器不使用快取,相容http 1.0 協議
header("pragma: no-cache");
根據這個原理,可以用在不經常更新或者需要經常重新整理的頁面,可以大大減輕伺服器的負擔,因為它如果發現客戶端有快取,就向客戶端傳送乙個304響應,然後停止程式的執行。
所以我們可以在**的最前部分設定返回給瀏覽的etag為某個值,然後在這個資源被第二次請求的時候就會附帶著乙個if-none-match 參 數,通過核實其值確實為所發出的etag值時就可以指定伺服器返回為304然後強行退出程式就行了,if-modified-since也是一樣的做法這 裡就只給出etag方法的php版(last-modified版的太常見了如設定快取超時等等):
php **複製到剪貼簿
if ($_server["http_if_none_match"] == "claymorephp.com") else 你還可以稍微改一下: $expires=date("ymd"); //一天後快取過期 if ($_server["http_if_none_match"] == $expires) else
另外,當gzip和etag同時使用時有時會出問題,就是etag沒有值,這個問題是普遍存在的,我暫時沒有找到相關的原因,網上搜了一會,普遍的人稱之為bug。
基於以上原因,關於phpblog的客戶端快取是以下來處理的(同時對http_if_none_match和http_if_modified_since進行判斷):
php **複製到剪貼簿
快取的header是這樣來傳送的:
php **複製到剪貼簿
$client_cache_time=$config_client_cache_time*60*60;//單位 - 秒 header('cache-control: public, max-age='.$client_cache_time); header('expires: '.gmdate('d, d m y h:i:s',time()+$client_cache_time).' gmt');//設定頁面快取時間 header('last-modified: '.gmdate('d, d m y h:i:s',time()).' gmt');//返回最後修改時間 header('pragma: public'); header('etag:phpblog');//返回標識,用於標識上次的確訪問過(瀏覽器中存在快取)
php 瀏覽器 快取,深入PHP與瀏覽器快取的分析
我們往往在伺服器上對快取設定進行各種優化方案,但是我們卻很少注意到客戶端快取,準確的說是瀏覽器的快取機制。其實每種瀏覽器都有快取策略,會暫時將每乙個瀏覽過的檔案快取在乙個特殊的資料夾裡。我們就可以在使用者重複提交頁面請求的時候,告訴使用者這個頁 面沒有改變,可以呼叫快取。那我們怎麼知道使用者有沒有這...
php 瀏覽器快取
瀏覽器快取動態內容,快取的內容在瀏覽器本地,而內容由web伺服器生成,任何一方都不可能完成這一系列過程,他們之間有一種溝通機制,這就是快取協商.如何協商 如用ie瀏覽器訪問這個頁面時,返回狀態碼200,連續多次重新整理這個頁面,這個頁面並沒有使用本地快取,也沒有向伺服器作出任何表示.開啟ie的和這個...
PHP 調整瀏覽器快取
用 php 控制瀏覽器快取是非常容易的,手冊上也相關的說明,由於很多初學者沒有把手冊看完,所以還是會有很多關於這個問題的疑問,故在此專門發一篇文章,同時對相關的語法做了詳細的說明,方便新手查閱。要解決這一問題,可以通過 php 中的 header 函式,傳送特定的快取控制原始 http 標頭,具體 ...