使用PHP缓存HTTP文件


Caching HTTP files with PHP

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

现在,缓存到期似乎是一件困难的事情,因为HTTPRFC定义了许多需要以所有可能的组合进行检查的缓存:

  • Expires
  • Cache-Control(具有数十个可能值)
  • Pragma

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

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

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

使用像Squid、Varnish甚至Apache mod_cache这样的反向代理将在缓存相关HTTP标头方面对您有很大帮助。但是,如果您需要一个完整的PHP版本,您应该尊重缓存控制,然后过期,因为当缓存控制和过期在同一HTTP响应中可用时,缓存控制优先于"最大年龄"属性,如中所述http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.3:

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

您还应该非常小心"无缓存"属性,这有点误导,因为它需要与原始服务器进行重新验证,所以它有点像"存储但在没有重新验证的情况下不从缓存提供服务"标头。

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

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

'希望有帮助:)

将Guzzle与HTTP缓存插件一起使用将是IMO.的最佳解决方案