Frage

ich mit der automatisierten Datenerfassung von einem PHP-Skript von einem Webserver bin zu kämpfen. Die Dateien in Frage Meteodaten enthalten und werden alle 10 Minuten aktualisiert. Seltsam genug, das ‚Datei geändert‘ Datum auf dem Webserver nicht ändert.

Ein einfach fopen ( 'http: // ...') -command versucht zu erhalten die frischesten Version der letzten Datei in diesem Verzeichnis jede Stunde. Aber regelmäßig beende ich mit einer Version auf bis zu 4 Stunden alt. Dies geschieht auf einem Linux-Server, der (wie mein Systemadministrator mir versichert hat) keinen Proxy-Server jeglicher Art verwendet werden.

Hat seinen eigenen Caching-Mechanismus PHP implementieren? Oder was sonst könnte stören hier?

(Meine aktuelle Problemumgehung ist die Datei über exec greifen ( 'wget --nocache ...'), die funktioniert.)

War es hilfreich?

Lösung

Da Sie die Datei über HTTP wenn es darum geht, gehe ich davon aus, dass PHP keine Cache-Header der Server mit ehren reagiert.

Eine sehr einfache und schmutzige Art und Weise, dass zu vermeiden, ist eine zufällige get Parameter auf jede Anforderung anhängen.

Andere Tipps

Die Q beobachteten Zwischenspeicherung von Inhalten von einem fopen zugegriffen Zusammenhang ( ‚http: // ...‘) und das Plakat gefragt, ob PHP seinen eigenen Caching-Mechanismus implementieren? Die anderen Antworten enthalten einige Spekulationen, aber sicher der einfachste Weg ist, um herauszufinden, durch den Quellcode schauen, um zu überprüfen, oder vielleicht leichter instrumentiert das System, ruft, was los ist? Dies ist trivial auf Debian-Systemen zu tun, wie folgt:

$ echo "Hello World" > /var/www/xx.txt
$ strace -tt -o /tmp/strace  \
> php -r 'echo file_get_contents("http://localhost/xx.txt");'
Hello World

Ich habe den entsprechenden Auszug des strace log unten enthalten, aber was dies zeigt, ist das die PHP RTS verbindet einfach localhost: 80 , sendet eine „GET /xx.txt“, bekommt ein Antwort-Headern umfasst und Dateiinhalt, die es dann an STDOUT Echos.

Absolut keine clientseitige Caching erfolgt innerhalb des PHP RTS, und da diese direkte HTTP-Socket-Dialog tut, es ist schwer, sich vorzustellen, wo Caching auf dem Client auftreten könnten. Wir sind mit der Möglichkeit der serverseitigen oder Zwischen Proxy-Caching links. (Anmerkung I standardmäßig ein von Access + 7 Tagen auf txt-Dateien ablaufen).

Logfile-Extrakt

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

Also, wenn ich verstehe Sie richtig, einen Teil des Problems könnte sein, dass die * .dat-Datei immer einen Zeitstempel von 01.00 hat? Haben Sie die Kontrolle über den Server mit den Daten (http://www.iac.ethz.ch/php/chn_meteo_roof/)? Wenn ja, sollten Sie versuchen, herauszufinden, warum immer die Daten den gleichen Zeitstempel haben. Ich habe zu glauben, wird es absichtlich gesetzt wird - das Betriebssystem den Zeitstempel aktualisieren, wenn die Datei geändert wird, wenn Sie aus dem Weg gehen, um es nicht so behelfen. Wenn Sie nicht herausfinden können, warum es auf 01.00 gesetzt wird, könnte man zumindest tut ein Befehl auf der Datei „berühren“, das aktualisiert wird es Zeitstempel geändert wird.

Das ist alles, natürlich, vorausgesetzt, Sie einige Zugriff auf den Server haben die Bereitstellung der Dateien.

warum nicht versuchen, mit curl , ich denke, das ist eine richtige Verwendung dafür.

vielleicht kann dieses Problem löst Ihr Problem (POST-Anforderung kann nicht so weit im Cache gespeichert werden, ich weiß)

$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);
*/
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top