瀏覽器是如何知道使用緩存的,其實這都是通過http中,瀏覽器將最后修改時間發送請求給web服務器,web服務器收到請求后跟服務器上的文檔最后修改的時間對比,如果web服務器上最新文檔修改時間小于或者等于瀏覽器發送過來的,則發送304給瀏覽器,使用緩存版本。
一、緩存的概念:
緩存這個東西真的是無處不在, 有瀏覽器端的緩存, 有服務器端的緩存,有代理服務器的緩存, 有ASP.NET頁面緩存,對象緩存。 數據庫也有緩存, 等等。
http中具有緩存功能的是瀏覽器緩存,以及緩存代理服務器。
http緩存的是指:當Web請求抵達緩存時, 如果本地有“已緩存的”副本,就可以從本地存儲設備而不是從原始服務器中提取這個文檔。
二、緩存的好處:
每次訪問網頁,通常瀏覽器會從服務器下載所 需的資源,例如 HTML 文檔、圖片、CSS、JavaScript,甚至包括字體文件等。這里面的許多文件(例如圖片)都是很少變動的,如果每次都要從服務器重新下載,會不必要 地增加網頁載入時間,同時也會對服務器造成一定壓力。通過合理配置緩存策略,可令瀏覽器以某種方式把這些靜態的文件緩存起來,下次請求同一資源時,直接使 用本地存儲的副本,而不是從服務器重新下載。
1、減少了冗余的數據傳輸,節省了網費。
2、減少了服務器的負擔, 大大提高了網站的性能。
3、加快了客戶端加載網頁的速度。
現在基本上每個瀏覽器都有F12檢查元素的功能,打開F12工具,選擇“網絡”,刷新頁面,然后點擊header頭部選項,就可以清楚的看到瀏覽器向服務器發送各種請求的詳情。如下圖,是我這個個人博客首頁的header頭部信息,很清楚的看到,應用了緩存。

三、header頭部與緩存有關的信息:
1、Resquest請求:
Cache-Control:max-age=0以秒為單位;
If-Modified-Since::Mon, 19 Nov 2012 08:38:01 GMT緩存文件的最后修改時間;
If-None-Match: "0693f67a67cc1:0"緩存文件的Etag值;
Cache-Control::no-cache不使用緩存;
Pragma: no-cache不使用緩存。
2、Response響應:
Cache-Control: public響應被緩存,并且在多用戶間共享, Cache-Control: private響應只能作為私有緩存,不能在用戶之間共享;
Cache-Control:no-cache提醒瀏覽器要從服務器提取文檔進行驗證Cache-Control:no-store絕對禁止緩存(用于機密,敏感文件);
Cache-Control: max-age=6060秒之后緩存過期(相對時間);
Date: Mon, 19 Nov 2012 08:39:00 GMT當前response發送的時間;
Expires: Mon, 19 Nov 2012 08:40:01 GMT緩存過期的時間(絕對時間);
Last-Modified: Mon, 19 Nov 2012 08:38:01 GMT服務器端文件的最后修改時間;
ETag: "20b1add7ec1cd1:0"服務器端文件的Etag值。
如果同時存在cache-control和Expires怎么辦呢?瀏覽器總是優先使用cache-control,如果沒有cache-control才考慮Expires。
四、如何判斷緩存到用戶本地的數據與服務器的數據是一致的,也就是本地緩存是否是最新的?
1、瀏覽器把緩存文件的最后修改時間通過 header ”If-Modified-Since“來告訴Web服務器。
第一步:瀏覽器客戶端想請求一個文檔, 首先檢查本地緩存,發現存在這個文檔的緩存, 獲取緩存中文檔的最后修改時間,通過: If-Modified-Since, 發送Request給Web服務器。
第二步:Web服務器收到Request,將服務器的文檔修改時間(Last-Modified): 跟request header 中的,If-Modified-Since相比較, 如果時間是一樣的, 說明緩存還是最新的, Web服務器將發送304 Not Modified給瀏覽器客戶端, 告訴客戶端直接使用緩存里的版本。如下圖。

第三步:假如該文檔已經被更新了。Web服務器將發送該文檔的最新版本給瀏覽器客戶端, 如下圖。

2、瀏覽器把緩存文件的ETag, 通過header "If-None-Match", 來告訴Web服務器。
ETag是實體標簽(Entity Tag)的縮寫, 根據實體內容生成的一段hash字符串(類似于MD5或者SHA1之后的結果),可以標識資源的狀態。 當資源發送改變時,ETag也隨之發生變化。
ETag是Web服務端產生的,然后發給瀏覽器客戶端。瀏覽器客戶端是不用關心Etag是如何產生的。
為什么使用ETag呢? 主要是為了解決Last-Modified 無法解決的一些問題。
1、某些服務器不能精確得到文件的最后修改時間, 這樣就無法通過最后修改時間來判斷文件是否更新了。
2.、某些文件的修改非常頻繁,在秒以下的時間內進行修改. Last-Modified只能精確到秒。
3.、一些文件的最后修改時間改變了,但是內容并未改變。 我們不希望客戶端認為這個文件修改了(最常見的情況)。
通過比較ETag的值,來判斷文件是否更新了,如下圖。

五、禁止瀏覽器使用緩存的方法。
CTRL+F5強制刷新瀏覽器,或者設置IE。 可以讓瀏覽器不使用緩存。原理過程是這樣的:
第一步:瀏覽器發送Http request, 給Web 服務器, header中帶有Cache-Control: no-cache,明確告訴Web服務器,客戶端不使用緩存。
第二步:Web服務器將把最新的文檔發送給瀏覽器客戶端。
六、直接使用緩存,不去服務器驗證,減少http請求。
按F5刷新瀏覽器和在地址欄里輸入網址然后回車。 這兩個行為是不一樣的。
按F5刷新瀏覽器, 瀏覽器會去Web服務器驗證緩存。
如果是在地址欄輸入網址然后回車,瀏覽器會"直接使用有效的緩存", 而不會發http request 去服務器驗證緩存,這種情況叫做緩存命中。

七、如何設置IE不使用緩存?
第一步:打開IE。點擊工具欄上的, 工具->Internet選項->常規->瀏覽歷史記錄 設置. 選擇“從不”。然后保存。
第二步:點擊“刪除” 把Internet臨時文件都刪掉 (IE緩存的文件就是Internet臨時文件)。

八、公有緩存和私有緩存的區別。
1、Cache-Control: public 指可以公有緩存, 可以是數千名用戶共享的。
2、Cache-Control: private 指只支持私有緩存, 私有緩存是單個用戶專用的。

- 0、php安裝
- 1、選擇PHP作為首選后端語言的原因
- 2、PHP基本語法
- 3、PHP中變量和常量的區別
- 4、PHP中單引號和雙引號的區別
- 5、PHP檢測數據類型的幾種方式
- 6、PHP數據類型轉換
- 7、return、break、continue的區別
- 8、PHP代碼重用
- 9、字符串移除或添加函數
- 10、PHP中字符串大小寫切換以及翻轉和加密
- 11、PHP字符串截取和截取函數
- 12、PHP字符串替換和比較函數
- 13、PHP字符串url解析和實體轉換
- 14、addslashes在預定義字符串前添加反斜杠
- 15、PHP中的數組基本概念
- 16、數組函數implode、explode、in_array、each、list
- 17、PHP數組函數(count、reset、end、next、current、key)
- 18、ZendStudio軟件破解安裝包免費下載
- 19、【圖文】ZendStudio漢化方法
- 20、數組函數in_array、array_search、array_change_key_case、array_chu
- 21、關閉PHP提示的方法(運行出現Notice : Use of undefined constant 的完美解決方案
- 22、PHP數組函數(array_diff_ukey、array_diff_uassoc、array_intersect
- 23、PHP數組函數(array_fill、array_filter、array_flip、array_key_exis
- 24、PHP數組去重及向前向后刪除元素的函數
- 25、PHP數組函數(array_map、array_walk、array_walk_recursive)
- 26、PHP數組函數(compact、extract)
- 27、PHP數組函數(array_merge、array_merge_recursive)
- 28、PHP數組函數(range、array_count_values、array_product)
- 29、PHP數組函數(array_reduce、array_slice、array_splice、array_sum)
- 30、PHP數組排序函數總結
- 31、PHP中面向對象的基本概念及定義對象的方法
- 32、PHP創建對象與構造函數
- 33、PHP對象的釋放
- 34、PHP面向對象的特性(抽象、封裝、繼承、多態)
- 35、PHP面向對象的public、private、protected之間的區別
- 36、PHP面向對象中的final和const的用法
- 37、PHP面向對象的static關鍵字
- 38、PHP中的單例模式
- 39、$this、self、parent詳解
- 40、PHP中面向對象的抽象類和抽象方法
- 41、PHP面向對象中的接口interface
- 42、PHP面向對象中的魔術方法
- 43、面向對象方法get_object_vars、is_subclass_of、interface_exists
- 44、PHP中的數學函數方法總結
- 45、PHP文件處理disk_total_space、disk_free_space、dirname、file_exis
- 46、PHP目錄操作rename和scandir
- 47、PHP操作目錄opendir、readdir、glob
- 48、PHP打開fopen、讀取fread、寫入文件fwrite
- 49、PHP文件處理file_get_contents、file_put_contents、fgetc、fgets、fg
- 50、PHP截取字符串出現亂碼的解決方法(UTF8和GBK)
- 51、PHP文件內容分頁操作,避免亂碼
- 52、PHP文件操作函數file、set_include_path、copy
- 53、PHP文件操作函數filemtime、filectime、fileatime、touch
- 54、PHP文件操作指針函數feof、ftell、fseek、rewind、fpassthru
- 55、PHP文件操作pathinfo、realpath、flock、tempnam、tmpfile
- 56、設置php.ini配置實現表單文件上傳流程
- 57、PHP將上傳到臨時文件夾的文件移動到服務器指定文件夾內
- 58、PHP+input表單實現多文件上傳
- 59、PHP通過超鏈接實現文件下載
- 60、發送header文件頭信息實現文件下載
- 61、PHP中的日期時間_時區時間戳函數使用
- 62、PHP操作COOKIE緩沖區影響COOKIE傳遞方式
- 63、PHP中SESSION定義、建立、刪除方式
- 64、PHP.INI配置文件中關于session的設置
- 65、HP中Session緩存的概念與用法
- 66、PHP自定義Session處理機制
- 67、通過MYSQL數據庫操作Session會話完整源碼類
- 68、PHP連接數據庫實現分頁代碼
- 69、HTTP緩存實現原理詳解
- 70、PHP連接數據庫實現搜索+分頁功能
- 71、PHP圖像處理之建立畫布填充顏色、打開不同圖像類型處理
- 72、PHP顏色或圖像填充及不同填充方式
- 73、PHP圖像處理之畫線&定義線樣式&寬度&風格&筆刷
- 74、PHP圖像處理:繪制色素及矩形圖
- 75、PHP圖像處理之畫圓、弧線、網站餅狀統計圖繪制
- 76、PHP圖像處理之繪制多邊行及文字繪制
- 77、PHP 圖像處理之獲得文字寬高屬性&圖片水印函數功能
- 78、PHP生成圖片驗證碼demo【OOP面向對象版本】
- 79、PHP圖像處理 圖像處理之處理文字及獲得文字尺寸屬性,imagecopymerge imagecop
- 80、替換用戶輸入的QQ表情
- 81、PHP封裝MYSQL數據庫操作類源碼
- 82、PHP與XML技術結合使用解析