2010-04-07 79 views
7

我下載了谷歌瀏覽器的谷歌速度追蹤器,看看我的網站如何做性能明智,它告訴我,我需要啓用緩存某些文件,如我的style.css,圖像等。如何使用控制緩存頭?

我讀過下面的PHP代碼應該告訴瀏覽器緩存html內容。我寫了一個快速的PHP頁面,其中包含一些圖片,並將下面的代碼粘貼在頂部(發送標頭之前),以測試它是如何工作的。

Header("Cache-Control: public, max-age=3600, must-revalidate"); 

當我回去的速度示蹤劑的分析,它說...

摘要 從緩存:假

請求頭 雜注:無緩存 的Cache-Control: max-age = 0

但在響應頭 ... 緩存控制:公共,最大年齡= 3600,必須重新驗證(正是我指定的)

我有點困惑,發生了什麼...?當它從緩存中表明:false是否意味着從服務器緩存而不是客戶端的緩存?

+0

請讓我發佈給你的調查結果 – 2011-02-10 19:15:20

回答

4

的關鍵是必須,重新驗證:這意味着,客戶端要求服務器,如果該文件已經改變。如果您不處理這種情況,瀏覽器將獲取新副本。

閱讀Mark Nottingham’s fantastic Caching Tutorial瞭解更多信息。 作爲PHP實現的一個示例,您可以使用my code

調查$_SERVER['HTTP_IF_NONE_MATCH']$_SERVER['HTTP_IF_MODIFIED_SINCE']驗證客戶端。並且請注意,這兩個標頭可能包含惡意代碼。 ;)

+0

所以你的意思是,可以緩存「圖像,CSS,腳本等」。使用此方法而不必修改服務器配置? – payling 2010-04-07 19:25:37

+0

是的,靜態文件由服務器處理。可執行文件(PHP,SSI,CGI)必須自己完成這項工作,因爲服務器無法知道它們產生了什麼內容。 – fuxia 2010-04-07 19:33:41

+0

這個答案是錯誤的 - 如果正確實施,提供的頭將強制內容緩存。 – symcbean 2010-04-08 00:19:28

0

當從緩存中說:假做 從服務器緩存和 不是客戶端的緩存是什麼意思?

^這是指客戶端緩存。

以這種方式設置緩存將覆蓋您的PHP文件,但您需要實現其他服務器端來緩存圖像,CSS,腳本等。如果您的服務器支持它,可以使用.htaccess完成。 。

例如,這是我在我的.htaccess文件中使用的幾個網站。

<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)(\.gz)?$"> 
    Header set Expires "Thu, 15 Apr 2012 20:00:00 GMT" 
    Header unset ETag 
    FileETag None 
</FilesMatch> 
+0

我希望這是一樣簡單的堅持一個.htaccess文件到我的網站directory.Our公司租出一個IIS6服務器(不使用.htaccess文件),我不直接控制服務器而不是ftp進入站點目錄... – payling 2010-04-07 19:32:29

+0

@payling:IIS可能有自己的配置處理程序來做同樣的事情,但如果一切都失敗了,你可以使用一個PHP文件來爲你的css/etc提供'''。但是,如果你必須這樣做,你應該真的這麼做。 – pinkgothic 2010-04-14 17:40:55

0

我對這個工具並不熟悉,但是,直到任何瀏覽器獲取緩存頭的內容,它都無法緩存它。看起來您的服務器正在發送預期的標題並且頁面應該被瀏覽器緩存 - 您的瀏覽器應該在現在的的緩存中有一個副本。如果您嘗試再次訪問同一頁面,則將從緩存而非源服務器獲取它(假設1小時的時間限制尚未過期)。

請注意,某些瀏覽器會將刷新請求解釋爲顯式請求,以忽略緩存並再次獲取頁面 - 嘗試通過鏈接訪問它,而不是點擊刷新按鈕。

C.

+0

據我所知,我發佈的代碼對我沒有任何幫助。我使用fiddler來分析流量,並使用或不使用瀏覽器從緩存的圖像/樣式表中繪製的代碼。這讓我感到困惑,因爲速度追蹤者說的是相反的......我將花更多的時間來了解發生了什麼。 – payling 2010-04-08 13:14:01

0

您需要了解這些Cache-Control header field指令實際上意味着:

  • public

    表示響應可以由任何緩存緩存,即使它通常不可緩存或僅在非共享緩存內緩存。 (也參見Authorization, section 14.8,對於額外的細節。)

  • max-age=3600指定的響應是新鮮3600秒:

    當最大年齡緩存控制指令是存在於一個高速緩存響應,如果當前年齡大於新資源請求時的年齡值(以秒爲單位),則響應失效。對響應的max-age指令意味着響應是可緩存的(即,「公開」),除非還存在其他更嚴格的緩存指令。

  • must-revalidate指定一個高速緩存必須重新驗證緩存的響應後它成爲使用該緩存的響應來滿足該請求之前陳舊:

    當必備revalidate指令是存在於響應由緩存接收,緩存不得使用該條目變爲陳舊之後才響應後續請求,而不必先用源服務器對其進行重新驗證。 (即,如果僅基於原始服務器的Expires或max-age值,則緩存必須每次都進行端到端重新驗證,否則緩存的響應將失效)。[...]服務器應發送must-revalidate指令當且僅當未能對實體的請求進行重新驗證可能會導致不正確的操作,例如默默未執行的財務事務。

現在,這是這些指令的本意。

但一如既往,現實是有一點不同:尤其是必重新驗證不被解釋爲僅重新驗證緩存的響應後,才變得陳舊,但它對每個後續請求重新驗證或者說,它必須根本不會被緩存(這可能是爲什麼它在隨後的請求中發送Cache-Control: max-age=0)。

「From Cache:false」似乎表明響應不是來自緩存,而是直接來自服務器。