PHP或Apache似乎正在缓存通过file_get_contents或include读取的文件(不需要的行为)


PHP or Apache seems to be caching files read via file_get_contents or include (unwanted behaviour)

我们的web应用程序的版本号会在每次请求时发送给客户端,这样我们就可以检测到代码的更新(即滚动更新),并显示一个弹出窗口,通知他们重新加载以利用最新更新。

但在服务器上更新版本号后,我遇到了一些奇怪的行为,有些请求返回新版本号,有些则返回旧版本号,所以弹出窗口一直弹出,直到你重新加载页面几次。

最初我怀疑apache可能是通过file_get_contents缓存它从磁盘上读取的文件,所以我现在没有将版本号存储在纯文本文件中,而是将其存储在每个请求都包含的php文件中,但我遇到了完全相同的问题!

有人知道是什么原因导致apache或php-it-self在我完成更新后提供旧信息吗?

编辑:我已经确认它不是浏览器缓存,因为我可以让客户端向服务器生成唯一的URL(它可以通过重写来处理),我仍然看到同样的问题,有些请求返回旧版本号,有些返回新版本号,清除浏览器缓存对没有帮助

编辑2:请求的响应标头

HTTP/1.1 200 OK
Date: Mon, 23 Jul 2012 16:50:53 GMT
Server: Apache/2.2.14 (Ubuntu)
X-Powered-By: PHP/5.3.2-1ubuntu4.7
Cache-Control: no-cache, must-revalidate
Pragma: no-cache
Expires: Sat, 26 Jul 1997 05:00:00 GMT
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 500
Connection: close
Content-Type: text/html

编辑3:因此,试图复制以获得我发现的响应标头,我只能通过我们的完整部署过程来实现,该过程包括创建存储代码的版本化文件夹,并将相关文件夹符号链接到webroot。仅仅更改版本号是不够的!所以似乎在某种程度上与我创建的符号链接有关!

当符号链接发生更改时,我也遇到了同样的问题。看看https://bugs.php.net/bug.php?id=36555也许这就是你想要的。

请尝试(如本错误报告中所述)将realpath_cache_size设置为0。