我正在编写一个通过 HTTP 和 HTTPS 请求文件的库。为了减少经常请求的 URL 的流量,我想缓存检索到的文件并尊重它们的缓存设置。
现在缓存过期似乎是一件困难的事情,因为HTTP RFC定义了很多需要在所有可能的组合中检查的缓存:
Expires
Cache-Control
(有几十个可能的值)Pragma
我可以想象有人已经编写了正确实现所有这些东西的 PHP 代码。它在哪里?
我正在编写一个通过 HTTP 和 HTTPS 请求文件的库。为了减少经常请求的 URL 的流量,我想缓存检索到的文件并尊重它们的缓存设置。
现在缓存过期似乎是一件困难的事情,因为HTTP RFC定义了很多需要在所有可能的组合中检查的缓存:
Expires
Cache-Control
(有几十个可能的值)Pragma
我可以想象有人已经编写了正确实现所有这些东西的 PHP 代码。它在哪里?
使用像 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 标头,原因有两个:
'希望有帮助:)
你是对的:有人已经这样做了:)
PHP 框架Symfony2带有一个缓存反向代理作为其标准发行版的一部分。此处的文档:http: //symfony.com/doc/2.0/book/http_cache.html
使用带有HTTP 缓存插件的Guzzle将是 IMO 的最佳解决方案。