2013-12-20 41 views
0

我有以下功能在我的頭PHP緩存的控制設定不工作

function header_alter($file) 
{ 
    $timestamp=filemtime($file); 
    $tsstring = gmdate('D, d M Y H:i:s ', $timestamp) . 'GMT'; 
    $etag = $timestamp; 
    $if_modified_since = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? $_SERVER['HTTP_IF_MODIFIED_SINCE'] : false; 
    $if_none_match = isset($_SERVER['HTTP_IF_NONE_MATCH']) ? $_SERVER['HTTP_IF_NONE_MATCH'] : false; 
    if ((($if_none_match && $if_none_match == $etag) || (!$if_none_match)) && 
     ($if_modified_since && $if_modified_since == $tsstring)) 
    { 
     $arr[] = 'HTTP/1.1 304 Not Modified';  
    } 
    else 
    { 
     $arr[] = "Last-Modified: $tsstring"; 
     $arr[] = "ETag: \"{$etag}\""; 
    } 
    $arr[] = "Cache-Control: max-age=3600"; 
    $arr[] = 'Expires: ' . date('D, d M Y H:i:s', time() + (3600)) . ' GMT'; 
    return $arr; 
} 

但是當我使用下面的代碼,看看標題

foreach (getallheaders() as $name => $value) { 
    echo "$name: $value\n"; 
} 

Host: localhost 
Connection: keep-alive 
**Cache-Control: max-age=0** 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36 
Accept-Encoding: gzip, deflate 
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6 
If-None-Match: "1387557104" 
If-Modified-Since: Fri, 19 Dec 2013 16:31:44 GMT 

該緩衝控制不會更新。 Thnx幫助球員。

+1

getallheaders()可以返回由客戶端當前請求所發送的報頭。客戶端無法告訴服務器緩存控制設置 - 這僅適用於服務器 - >客戶端響應。你需要使用客戶端工具(例如,螢火蟲,開發者控制檯,等等等等)看看服務器發送了什麼標題。 –

+0

即時通訊使用鉻,我到底怎麼做? – Anup

+0

'ctrl-shift-i'打開chrome開發工具。點擊網絡標籤,點擊與腳本URL相對應的請求,然後點擊標題標籤 –

回答

0

我們可以使用Cache-Control:max-age = ...來通知瀏覽器該組件在指定的時間內不會被更改。這樣,如果瀏覽器在其緩存中已有組件,並因此可以更快地執行引發緩存頁面查看,我們可以避免不必要的進一步請求。 即使沒有任何緩存控制標頭,現代瀏覽器也可以使用一些啓發式方法來緩存靜態文件,但如果我們隱式定義緩存標頭,它們會更有效率。

對於Apache2的,你可以使用指定mod_expires使最大年齡:

ExpiresActive On 
ExpiresByType image/gif "access plus 1 month" 
ExpiresByType image/png "access plus 1 month" 
ExpiresByType image/jpeg "access plus 1 month" 
ExpiresByType text/css "access plus 1 month" 
ExpiresByType text/javascript "access plus 1 month" 
ExpiresByType application/x-javascript "access plus 1 month" 
ExpiresByType application/x-shockwave-flash "access plus 1 month" 

對於Lighttpd的有mod_expire模塊。
在server.modules部分啓用它:

server.modules = (
... 
"mod_expire", 
... 
) 

然後添加下面的指令與靜態文件目錄:

$HTTP["url"] =~ "^/images/" { 
expire.url = ("" => "access 30 days") 
} 

最大年齡爲Nginx的服務器可以使用ngx_http_headers_module啓用: 期滿最大;

現在Web服務器發送緩存頭對靜態文件: 緩存控制:最大年齡= 2592000

在設計變更的情況下,我們應該避免使用瀏覽器在他們的緩存過時的內容。這可以通過將文件版本添加到文件名來完成: script.js - > script1.js - > script2.js - > ...等

緩存控制:max-age也可以用於輸出HTML 。想象一下,由PHP生成的頁面變化不是很頻繁,每天一次甚至更長時間。但瀏覽器仍然必須在每個頁面視圖下載HTML。 我們可以通過發送PHP中的最大年齡值來改善它。

header('Cache-Control: max-age=28800');