【问题标题】:Caching a GET request for audio with PHP使用 PHP 缓存音频的 GET 请求
【发布时间】:2011-10-27 18:49:41
【问题描述】:

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

<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?

【问题讨论】:

  • 尝试使用 header("Expires: Mon, 26 Dec 2050 00:00:00 GMT");

标签: php javascript html audio cache-control


【解决方案1】:

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

header("Pragma: public");

在缓存控制标头之上。

我也认为您需要 expires 标头:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-25
      相关资源
      最近更新 更多