用PHP缓存音频的GET请求


Caching a GET request for audio with PHP

我有一个PHP脚本,用于响应音频资源的GET请求。HTML5 Audio标签请求一个音频文件,例如:

<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开发人员工具的网络选项卡时,我看到它每次都重新下载音频剪辑,而不是说"从缓存",如果我在响应头中查看,我确实看到了我设置的缓存控制头。它为什么要忽略这一点呢?Amidoingitright吗?

我在PHP中这样做已经有一段时间了,但尝试添加:

header("Pragma: public");

在cache-control头之上。

我也认为你需要expires头:

header('Expires: ' . gmdate('D, d M Y H:i:s', time()+2419200) . ' GMT');

除此之外,您可以开始使用PHP中的get_headers()函数来调试出错的地方

您是否在第二个请求中看到一个名为If-Modified-Since:的标头?

这就是你需要捕获、解析和响应的内容——如果你不想再次发送文件,你可以用HTTP/1.1 304 Not Modified来响应。如果您正在使用Apache,您可以检查apache_request_headers()结果中的头。如果您不使用Apache,您可能会发现很难处理这个问题—您可能必须找到一种方法,让web服务器将头设置为环境变量,因此它们在$_ENV$_SERVER中可用。有一种方法可以在Apache中使用mod_rewrite(见上面链接页面上的最新评论),所以在其他服务器环境中也可能有一种方法来做到这一点。

HTTP 1.1中的缓存允许(实际上是鼓励)这种行为——这意味着缓存的副本将始终是最新的。