2011-10-27 47 views
0

我有一個PHP腳本,它響應音頻資源的GET請求。一個HTML5音頻標籤要求的音頻文件,如:用PHP緩存GET音頻請求

<audio src="get_audio.php?f=fun" preload></audio> 

無需用戶下載相同的音頻文件每一次,所以我想緩存它。在我的PHP文件我有:

header("Cache-Control: max-age=2419200"); 
header("Content-Type: audio/mpeg"); 

... 

echo file_get_contents($path); 

但是當我查看Chrome開發者工具的網絡標籤我看到它重新下載音頻剪輯每次而不是說「從緩存中」,如果我看在響應我確實看到了我設置的Cache-Control頭。爲什麼會忽略這個? Amidoingitright?

+0

嘗試使用標題(「過期時間:週一,2050年12月26日00:00:00 GMT」); –

+0

不幸的是沒有運氣。 – rewolf

回答

0

這已經有一段時間,因爲我這樣做在PHP,但嘗試添加:

header("Pragma: public"); 

的Cache-Control頭以上。

我還認爲你需要expires頭:

比,你可以開始使用get_headers在PHP()函數來調試到哪裏去錯誤
header('Expires: ' . gmdate('D, d M Y H:i:s', time()+2419200) . ' GMT'); 

其他。

0

您是否在第二個請求If-Modified-Since:中看到標題?

這是你需要捕捉,解析和迴應的內容 - 如果你不想再次發送文件,你迴應HTTP/1.1 304 Not Modified。如果您使用的是Apache,則可以檢查apache_request_headers()的結果中的標題。如果你不使用Apache,你可能會發現很難處理這個問題 - 你可能必須找到一種方法讓web服務器將頭文件設置爲環境變量,所以它們可以在$_ENV$_SERVER中找到。有一種方法可以在Apache中使用mod_rewrite完成此操作(請參閱上面鏈接的最新評論),所以在其他服務器環境中也可能會這樣做。

HTTP 1.1中的緩存允許(並且確實鼓勵)這種行爲 - 這意味着緩存副本將始終是最新的。