2

我正在编写一个通过 HTTP 和 HTTPS 请求文件的库。为了减少经常请求的 URL 的流量,我想缓存检索到的文件并尊重它们的缓存设置。

现在缓存过期似乎是一件困难的事情,因为HTTP RFC定义了很多需要在所有可能的组合中检查的缓存:

  • Expires
  • Cache-Control(有几十个可能的值)
  • Pragma

我可以想象有人已经编写了正确实现所有这些东西的 PHP 代码。它在哪里?

4

3 回答 3

3

使用像 Squid、Varnish 甚至 Apache mod_cache 这样的反向代理将在缓存相关的 HTTP 标头方面为您提供很多帮助。但是,如果您需要一个完整的 PHP 版本,您应该先使用 Cache-Control,然后再使用 Expires,因为当 Cache-Control 和 Expires 在同一个 HTTP 响应中可用时,Cache-Control 优先于http中所述的“max-age”属性://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.3

如果响应包含 Expires 标头和 max-age 指令,则 max-age 指令将覆盖 Expires 标头,即使 Expires 标头更具限制性。对于给定的响应,此规则允许源服务器向 HTTP/1.1(或更高版本)缓存提供比 HTTP/1.0 缓存更长的到期时间。如果某些 HTTP/1.0 缓存不正确地计算年龄或过期时间,这可能很有用,可能是由于时钟不同步。

您还应该非常小心“no-cache”属性,这有点误导,因为它需要与原始服务器重新验证,所以它有点像“store-but-do-no-serve-from-cache” -without-revalidation”标题。

您也可以忽略 Pragma 标头,原因有两个:

  • 它是请求标头,而不是响应标头
  • 它适用于 HTTP 1.0,现在(几乎整个)世界都是 HTTP 1.1 :)

'希望有帮助:)

于 2012-02-08T07:18:54.717 回答
3

你是对的:有人已经这样做了:)

PHP 框架Symfony2带有一个缓存反向代理作为其标准发行版的一部分。此处的文档:http: //symfony.com/doc/2.0/book/http_cache.html

于 2012-02-08T07:30:59.463 回答
0

使用带有HTTP 缓存插件的Guzzle将是 IMO 的最佳解决方案。

于 2014-01-10T04:41:55.997 回答