在PHP动态创建HTTP响应时缓存它们

在PHP动态创建HTTP响应时缓存它们,php,caching,http-headers,Php,Caching,Http Headers,我觉得我的问题似乎很随意,但请耐心等待,因为它变得有趣(至少对我来说:)) 考虑一个PHP页面,其目的是从文件系统中读取请求的文件,并将其作为响应进行回显。现在的问题是如何为此页面启用缓存?需要指出的是,文件可能相当大,启用缓存是为了避免客户端一次又一次地下载相同的内容 理想的策略是使用“If None Match”请求头和“ETag”响应头来实现反向代理缓存系统。尽管我知道这一点,但我不确定这是否可行,或者我应该返回什么作为响应来实现这一技术 用PHP提供大量的辅助文件并不完全是它的目的 相反

我觉得我的问题似乎很随意,但请耐心等待,因为它变得有趣(至少对我来说:))

考虑一个PHP页面,其目的是从文件系统中读取请求的文件,并将其作为响应进行回显。现在的问题是如何为此页面启用缓存?需要指出的是,文件可能相当大,启用缓存是为了避免客户端一次又一次地下载相同的内容


理想的策略是使用“If None Match”请求头和“ETag”响应头来实现反向代理缓存系统。尽管我知道这一点,但我不确定这是否可行,或者我应该返回什么作为响应来实现这一技术

用PHP提供大量的辅助文件并不完全是它的目的

相反,看看nginx、Lighttpd或Apache

最初的请求由PHP处理,但一旦确定了下载文件,它就会设置一些头来指示服务器应该处理文件发送,然后释放PHP进程以提供其他服务

然后可以使用web服务器为您配置缓存

静态生成的内容

如果您的内容是从PHP生成的,并且创建成本特别高,则可以将输出写入本地文件,然后再次应用上述方法

如果无法写入本地文件或不想写入,可以使用HTTP响应头控制缓存:

Expires: <absolute date in the future>
Cache-Control: public, max-age=<relative time in seconds since request>

如果您不能进行文件缓存,您仍然可以使用
ETag
来确定内容是否同时发生了更改。

我忘了提到这一点是我的错,消除PHP是不可能的。PHP中可能有一个复杂的逻辑。@MehranZiadloo可能你没有得到我的答案,我已经重新措辞了。尽管你的更新澄清了你的观点,但我担心仍然无法消除PHP,因为内容有时是生成的,而不是加载的。谢谢。再次更新了答案。您说过“目的是从文件系统读取文件”,所以您应该更清楚:)ping是如何工作的?我的意思是,当客户端请求一个页面时,我看不到任何HTTP\u IF\u MODIFIED\u SINCE变量,并且我在提供文档时设置了ETAG。因为这不起作用,我设计了另一种方法,用ajax“ping”服务器并请求版本号。如果版本号与页面不同,则将由window.location.reload(true)重新加载以强制请求。缓存所有内容部分(例如css和js)时,只需要一个请求来检查差异,而不是分配“304未修改”回复。也许它依赖于JS是件坏事,但工作起来很酷。但仍然不是我的对手。别这么肯定,这只眼睛的主人现在是Juubi的Jinchuuriki!现在,但我的王牌还没有揭晓。让我们继续聊天。我已经在那里了,但问题是我几乎没有时间发布任何东西。很抱歉
ETag: <hash of the contents>
Last-Modified: <absolute date of last contents change>
If-None-Match: <hash of the contents that you sent last time>
If-Modified-Since: <absolute date of last contents change>
if (!file_exists('cache.txt') || 
    filemtime('cache.txt') > strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
    // update cache file and send back contents as usual (+ cache headers)
} else {
    header('HTTP/1.0 304 Not modified');
}