PHPs fopen函数是否实现某种缓存?

PHPs fopen函数是否实现某种缓存?,php,http,caching,fopen,Php,Http,Caching,Fopen,我正在努力从Web服务器自动收集PHP脚本的数据。包含气象数据,每10分钟更新一次。奇怪的是,Web服务器上的“文件修改”日期没有改变 一个简单的例子http://...“)-命令尝试每小时获取此目录中最后一个文件的最新版本。但通常我会得到一个长达4小时的版本。这种情况发生在Linux服务器上(正如我的系统管理员向我保证的那样),它不使用任何类型的代理服务器 PHP是否实现了自己的缓存机制?或者还有什么会干扰这里 (我目前的解决方法是通过exec('wget--nocache…')获取文件,这很

我正在努力从Web服务器自动收集PHP脚本的数据。包含气象数据,每10分钟更新一次。奇怪的是,Web服务器上的“文件修改”日期没有改变

一个简单的例子http://...“)-命令尝试每小时获取此目录中最后一个文件的最新版本。但通常我会得到一个长达4小时的版本。这种情况发生在Linux服务器上(正如我的系统管理员向我保证的那样),它不使用任何类型的代理服务器

PHP是否实现了自己的缓存机制?或者还有什么会干扰这里


(我目前的解决方法是通过exec('wget--nocache…')获取文件,这很有效。)

因为您是通过HTTP获取文件的,所以我假设PHP将遵守服务器响应的任何缓存头


避免这种情况的一种非常简单而肮脏的方法是在每个请求中附加一些随机get参数。

因此,如果我理解正确,部分问题可能是*.dat文件的时间戳始终为上午1:00?您是否可以控制包含数据的服务器(
http://www.iac.ethz.ch/php/chn_meteo_roof/
)?如果是这样,您应该尝试找出为什么数据总是具有相同的时间戳。我不得不相信这是故意设置的——当文件被修改时,操作系统会更新时间戳,除非你特意让它不这样做。如果你不明白为什么它被设置为凌晨1点,你至少可以对文件执行一个“touch”命令,这将更新它修改后的时间戳


当然,假设您可以访问提供文件的服务器,那么就这些了。

为什么不尝试使用,我认为这是一个更合适的用法。

也许这可以解决您的问题(据我所知,POST请求无法缓存)


Q与观察到的fopen访问的内容缓存相关http://...)海报想知道PHP是否实现了自己的缓存机制?其他答案包括一些推测,但确定最简单的方法是通过查看源代码进行检查,或者可能更容易检测系统调用以查看发生了什么?这在Debian系统上很容易做到,如下所示:

$ echo "Hello World" > /var/www/xx.txt
$ strace -tt -o /tmp/strace  \
> php -r 'echo file_get_contents("http://localhost/xx.txt");'
Hello World
我已经在下面列出了strace日志的相关摘录,但这显示了PHP RTS只需连接到localhost:80,发送一个“GET/xx.txt”,获取一个包含头和文件内容的响应,然后将其回显到STDOUT

PHP RTS中绝对没有客户端缓存,因为这是直接的HTTP套接字对话,所以很难想象缓存会发生在客户端的什么地方。我们只剩下服务器端或中间代理缓存的可能性。(注意,我默认txt文件的访问期限为+7天)

日志文件提取
不,我没有控制权。这确实解决了问题,但并没有真正回答问题:为什么会发生这种情况?@nickf,假设是危险的,特别是当检查显示你错了时,所以很抱歉,但是a-1:-(我将在下面给出一个完整的解释,因为答案是URL也有同样的问题。wget也有同样的问题,除非我使用--no cache参数。是的,但您可以为此设置一个curl选项,并且拥有比运行exec.alives更好的代码流。
$ echo "Hello World" > /var/www/xx.txt
$ strace -tt -o /tmp/strace  \
> php -r 'echo file_get_contents("http://localhost/xx.txt");'
Hello World
00:15:41.887904 socket(PF_INET6, SOCK_STREAM, IPPROTO_IP) = 3
00:15:41.888029 fcntl(3, F_GETFL)       = 0x2 (flags O_RDWR)
00:15:41.888148 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
00:15:41.888265 connect(3, {sa_family=AF_INET6, sin6_port=htons(80), inet_pton(AF_INET6, "::1", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = -1 EINPROGRESS (Operation now in progress)
00:15:41.888487 poll([{fd=3, events=POLLIN|POLLOUT|POLLERR|POLLHUP}], 1, 60000) = 1 ([{fd=3, revents=POLLOUT}])
00:15:41.888651 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
00:15:41.888838 fcntl(3, F_SETFL, O_RDWR) = 0
00:15:41.888975 sendto(3, "GET /xx.txt HTTP/1.0\r\n", 22, MSG_DONTWAIT, NULL, 0) = 22
00:15:41.889172 sendto(3, "Host: localhost\r\n", 17, MSG_DONTWAIT, NULL, 0) = 17
00:15:41.889307 sendto(3, "\r\n", 2, MSG_DONTWAIT, NULL, 0) = 2
00:15:41.889437 poll([{fd=3, events=POLLIN|POLLPRI|POLLERR|POLLHUP}], 1, 0) = 0 (Timeout)
00:15:41.889544 poll([{fd=3, events=POLLIN|POLLERR|POLLHUP}], 1, 60000) = 1 ([{fd=3, revents=POLLIN}])
00:15:41.891066 recvfrom(3, "HTTP/1.1 200 OK\r\nDate: Wed, 15 F"..., 8192, MSG_DONTWAIT, NULL, NULL) = 285
00:15:41.891235 poll([{fd=3, events=POLLIN|POLLERR|POLLHUP}], 1, 60000) = 1 ([{fd=3, revents=POLLIN}])
00:15:41.908909 recvfrom(3, "", 8192, MSG_DONTWAIT, NULL, NULL) = 0
00:15:41.909016 poll([{fd=3, events=POLLIN|POLLERR|POLLHUP}], 1, 60000) = 1 ([{fd=3, revents=POLLIN}])
00:15:41.909108 recvfrom(3, "", 8192, MSG_DONTWAIT, NULL, NULL) = 0
00:15:41.909198 close(3)                = 0
00:15:41.909323 write(1, "Hello World\n", 12) = 12
00:15:41.909532 munmap(0x7ff3866c9000, 528384) = 0
00:15:41.909600 close(2)                = 0
00:15:41.909648 close(1)                = 0