?
Dokumen ini menggunakan Manual laman web PHP Cina Lepaskan
通過重復使用先前提取的資源,可以顯著提高網(wǎng)站和應用程序的性能。Web緩存減少了延遲和網(wǎng)絡流量,從而減少了顯示資源表示所需的時間。通過使用HTTP緩存,網(wǎng)站變得更加快速響應。
緩存是一種技術(shù),可存儲給定資源的副本,并在請求時將其返回。當Web緩存在其存儲中具有請求的資源時,它攔截該請求并返回其副本,而不是從原始服務器重新下載。這實現(xiàn)了幾個目標:它減輕了不需要為所有客戶端服務的服務器的負載,并且通過更接近客戶端來提高性能,即,將資源傳回的時間更短。對于一個網(wǎng)站來說,它是實現(xiàn)高性能的一個重要組成部分。另一方面,它必須正確配置,因為并非所有資源都永遠保持一致:僅在資源緩存更改時才緩存資源,這一點非常重要。
有幾種緩存:這些緩存可以分為兩大類:私有緩存或共享緩存。甲共享高速緩存是由一個以上的用戶存儲用于重用響應的高速緩存中。一個私有緩存專用于單個用戶。該頁面主要討論瀏覽器和代理緩存,但也有部署在Web服務器上的網(wǎng)關緩存,CDN,反向代理緩存和負載平衡器,以提高網(wǎng)站和Web應用程序的可靠性,性能和擴展性。
專用緩存專用于單個用戶。您可能已經(jīng)在瀏覽器的設置中看到“緩存”。瀏覽器緩存保存用戶通過HTTP下載的所有文檔。該緩存用于使訪問文檔可用于后退/前進導航,保存,以源代碼查看等,而無需額外訪問服務器。它同樣改進了緩存內(nèi)容的離線瀏覽。
共享緩存是一個緩存,用于存儲將被多個用戶重用的響應。例如,ISP或貴公司可能已將Web代理設置為其本地網(wǎng)絡基礎架構(gòu)的一部分,以便為許多用戶提供服務,從而使常用資源多次重復使用,從而減少網(wǎng)絡流量和延遲。
HTTP緩存是可選的,但通常需要重新使用緩存資源。但是,常見的HTTP緩存通常僅限于緩存響應GET
并可能拒絕其他方法。主緩存鍵由請求方法和目標URI組成(通常只有URI被使用,因為只有GET請求才是緩存目標)。常見的緩存條目形式是:
檢索請求的成功結(jié)果:200
對GET
包含諸如HTML文檔,圖像或文件等資源的請求的(確定)響應。
永久重定向:a 301
(永久移動)響應。
錯誤響應:一個404
(未找到)結(jié)果頁面。
不完整的結(jié)果:(206
部分內(nèi)容)響應。
除了GET
定義適合用作緩存鍵的東西之外的其他響應。
如果請求是內(nèi)容協(xié)商的目標,則高速緩存條目也可能由多個由輔助鍵區(qū)分的存儲響應組成。有關更多詳細信息,請參閱Vary
下面的標題信息。
Cache-control
頭Cache-Control
HTTP / 1.1通用頭字段用于指定在請求和響應緩存機制的指令。使用這個頭文件可以用它提供的各種指令來定義你的緩存策略。
緩存不應該存儲有關客戶端請求或服務器響應的任何內(nèi)容。一個請求被發(fā)送到服務器,并且每次都會下載一個完整的響應。
Cache-Control: no-store Cache-Control: no-cache, no-store, must-revalidate
在釋放緩存副本之前,緩存會將請求發(fā)送到原始服務器進行驗證。
Cache-Control: no-cache
“public”指令表明響應可能被任何緩存緩存。如果頁面具有HTTP身份驗證或響應狀態(tài)代碼通常不可緩存的頁面現(xiàn)在應該被緩存,這可能很有用。另一方面,“私有”表示該響應僅適用于單個用戶,并且不得由共享緩存存儲。在這種情況下,私人瀏覽器緩存可能會存儲響應。
Cache-Control: privateCache-Control: public
這里最重要的指令是“ max-age=<seconds>
”,這是資源被認為是最新的最大時間量。相反Expires
,這個指令是相對于請求的時間而言的。對于應用程序中不會更改的文件,通??梢蕴砑臃e極的緩存。這包括靜態(tài)文件,例如圖像,CSS文件和JavaScript文件。
有關更多詳細信息,另請參閱下面的“新鮮度”部分。
Cache-Control: max-age=31536000
使用“ must-revalidate
”指令時,緩存必須在使用前驗證陳舊資源的狀態(tài),不應使用過期資源。有關更多詳細信息,請參閱下面的驗證部分。
Cache-Control: must-revalidate
Pragma
頭Pragma
是一個HTTP / 1.0標頭,它是未指定的HTTP響應,因此不為普通HTTP / 1.1的可靠替換Cache-Control
首部,雖然它不表現(xiàn)一樣Cache-Control: no-cache
,如果Cache-Control
在請求中省略報頭字段。使用Pragma
僅適用于HTTP / 1.0客戶端的向后兼容性。
一旦資源存儲在緩存中,理論上它可以永久存儲在緩存中。緩存具有有限的存儲空間,因此項目會定期從存儲中刪除。這個過程被稱為緩存逐出。另一方面,服務器上的一些資源可能會發(fā)生變化,所以應該更新緩存。由于HTTP是客戶端 - 服務器協(xié)議,因此當資源發(fā)生更改時,服務器無法聯(lián)系緩存和客戶端; 他們必須傳達資源的到期時間。在這個到期時間之前,資源是新鮮的 ; 到期后,資源已過時。驅(qū)逐算法經(jīng)常使新資源超過陳舊的資源。請注意,陳舊的資源不會被驅(qū)逐或忽略; 當緩存接收到過時資源的請求時,它會將此請求轉(zhuǎn)發(fā)給a,If-None-Match
以檢查它是否實際上仍然是新的。如果是這樣,服務器返回304
(未修改)標題,而不發(fā)送請求資源的主體,節(jié)省一些帶寬。
以下是使用共享高速緩存代理的此過程示例:
更新度使用壽命是根據(jù)多個標題計算得出的。如果Cache-control: max-age=N
指定了“ ”標題,則新鮮度生存期等于N.如果該標題不存在(通常是這種情況),則檢查Expires
標題是否存在。如果Expires
存在標題,則其值減去Date
標題的值確定新鮮度生存期。最后,如果兩個標題都不存在,請查找Last-Modified
標題。如果存在這個頭部,則緩存的新鮮度壽命等于Date
頭部的值減去頭部的值Last-modified
除以10。
到期時間計算方法如下:
expirationTime = responseTime + freshnessLifetime - currentAge
responseTime
根據(jù)瀏覽器收到響應的時間在哪個位置?
我們使用緩存資源越多,網(wǎng)站的響應能力和性能就越好。為了優(yōu)化這一點,良好的做法建議盡可能在將來設定到期時間。對于定期更新或經(jīng)常更新的資源,這是可能的,但對于很少和不經(jīng)常更新的資源而言存在問題。他們是從緩存資源中受益最多的資源,但這使得它們很難更新。這是包含并鏈接到每個網(wǎng)頁的技術(shù)資源的典型代表:JavaScript和CSS文件很少更改,但當它們更改時,您希望它們能夠快速更新。
Web開發(fā)人員發(fā)明了一種Steve Sounders稱之為改變的技術(shù)。不經(jīng)常更新的文件以特定的方式命名:在他們的URL中,通常在文件名中添加修訂版(或版本)號。這樣,每一個這個資源的新版本都被認為是永遠不會有的資源變化并且可能在將來有很長的到期時間,通常是一年甚至更長。為了獲得新的版本,所有到它們的鏈接都必須改變,這就是這種方法的缺點:通常由Web開發(fā)人員使用的工具鏈來處理額外的復雜性。當不經(jīng)常變化的資源發(fā)生變化時,它們會對經(jīng)常變化的資源產(chǎn)生額外的變化。當這些被讀取時,其他的新版本也被讀取。
這種技術(shù)還有一個額外的好處:同時更新兩個緩存資源不會導致一種資源的過時版本與另一種資源的新版本結(jié)合使用的情況。當網(wǎng)站具有相互依賴的CSS樣式表或JS腳本時,這是非常重要的,即它們相互依賴,因為它們引用相同的HTML元素。
添加到revved資源中的修訂版本不需要像1.1.3這樣的經(jīng)典修訂字符串,或者甚至是單調(diào)增長的一組數(shù)字。它可以是防止碰撞的任何東西,比如散列或日期。
當用戶按下重新加載按鈕時,觸發(fā)重新驗證。如果緩存的響應包含“ Cache-control: must-revalidate
”標題,它也會在正常瀏覽下觸發(fā)。另一個因素是首Advanced->Cache
選項面板中的緩存驗證首選項。每次加載文檔時都有一個強制驗證的選項。
當達到緩存文檔的到期時間時,它將被驗證或再次提取。驗證只有在服務器提供強驗證器或弱驗證器時才會發(fā)生。
ETag
響應報頭是不透明到所述-用戶代理 可以使用作為強驗證值的。這意味著HTTP用戶代理(如瀏覽器)不知道該字符串代表什么,也無法預測其價值。如果ETag
頭部是資源響應的一部分,則客戶端可以If-None-Match
在未來請求的頭部中發(fā)出- 以驗證緩存的資源。
的Last-Modified
響應報頭可以被用作弱驗證器。它被認為是微弱的,因為它只有1秒的分辨率。如果Last-Modified
標題出現(xiàn)在響應中,則客戶端可以發(fā)出If-Modified-Since
請求標頭來驗證緩存的文檔。
當發(fā)出驗證請求時,服務器可以忽略驗證請求并以普通方式進行響應200
OK
,也可以返回304
Not Modified
(使用空的主體)來指示瀏覽器使用其緩存副本。后一個響應還可以包括更新緩存文檔到期時間的標題。
該Vary
HTTP響應頭決定如何滿足未來的請求頭,以決定一個緩存的響應是否可以使用,而不是請求從源服務器一個新的一個。
當緩存接收到具有Vary
頭字段的緩存響應可以滿足的請求時,它不得使用該緩存的響應,除非頭中指定的所有頭字段Vary
在原始(緩存)請求和新請求中都匹配。
例如,這對于動態(tài)提供內(nèi)容非常有用。使用Vary: User-Agent
標題時,緩存服務器在決定是否從緩存中提供頁面時應考慮用戶代理。如果您向移動用戶提供不同的內(nèi)容,它可以幫助您避免緩存可能會錯誤地將您的網(wǎng)站的桌面版本提供給移動用戶。此外,它可以幫助Google和其他搜索引擎發(fā)現(xiàn)頁面的移動版本,并且可能會告訴他們沒有打算使用Cloaking。
Vary: User-Agent
由于User-Agent
移動和桌面客戶端的標頭值不同(“變化”),緩存將不會用于將移動內(nèi)容錯誤地提供給桌面用戶,反之亦然。
RFC 7234:超文本傳輸協(xié)議(HTTP / 1.1):緩存
緩存教程 - 馬克諾丁漢
HTTP緩存 - Ilya Grigorik
RedBot,一種檢查與緩存相關的HTTP標頭的工具。