我正在与从网络服务器PHP脚本的自动数据采集挣扎。 问题的文件包含气象数据,并每隔10分钟更新一次。古怪足够,在Web服务器上的“文件修改”日期不会改变。

一个简单的fopen (的 'http:// ...')-command试图得到最后一个文件的每小时使用最新版本此目录中。但是经常我最终版本长达4个小时了。出现这种情况,其(由于我的系统管理员向我保证)不使用任何类型的代理服务器,Linux服务器上。

请问PHP实现自己的缓存机制?或者有什么人可以在这里干扰?

(我的当前的解决方法是通过EXEC( 'wget的--nocache ...'),其工作以抓住该文件。)

有帮助吗?

解决方案

既然你要通过HTTP文件,我假设PHP会接受任何缓存头服务器与响应。

一个非常简单的和脏的方式,以避免对一些随机GET参数附加到每个请求。

其他提示

与由访问的fopen观察到的内容缓存的Q(的“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只是连接为本地主机:80 ,发送“GET /xx.txt”,得到了响应包括标头和文件内容它然后呼应到STDOUT。

绝对没有客户端缓存的PHP RTS内发生,并且由于这是操作的方式直接HTTP套接字对话,这是很难想象其中高速缓存可以在客户机上进行。我们留下了服务器端或中间代理缓存的可能性。 (注意我默认为接通txt文件的访问+ 7天后失效)。

日志文件提取

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

所以,如果我正确理解你的问题的一部分可能是,* .dat文件总是凌晨1:00的时间戳?你有没有包含数据(http://www.iac.ethz.ch/php/chn_meteo_roof/)服务器的控制权?如果是这样,你应该尝试找出为什么数据总是具有相同的时间戳。我不得不相信它是被故意设置 - 除非你走出自己的路,使之不这样做的OS将更新时间戳当文件被修改。如果它为什么被设置为凌晨1点,你不能弄清楚,你至少可以做一个“触摸”命令的文件,这将更新它的修改时间戳。

这是所有的,当然,假设你有一些访问服务器提供的文件。

为什么不尝试使用卷曲,我觉得这是这个更正确使用。

也许这可以解决您的问题(POST请求不能因为据我所知缓存)

$opts = array('http' =>
  array(
    'method'  => 'POST',
    'content'=>''
  )
);
$context  = stream_context_create($opts);
$resource = fopen ('http://example.com/your-ulr', 'r', false, $context);

/* or you can use file_get_contents to retrieve all the file 
   $fileContent = file_get_contents('http://example.com/your-ulr', false, $context);
*/
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top