Domanda

sto lottando con la raccolta automatica dei dati di uno script PHP da un server web. I file in questione contengono dati meteo e sono aggiornati ogni 10 minuti. Stranamente, la data di 'file modificato' sul server web non cambia.

Un semplice fopen ( 'http: // ...') -command cerca di ottenere la versione più recente dell'ultimo file in questa directory ogni ora. Ma regolarmente io alla fine con una versione fino a 4 ore di vita. Questo accade su un server Linux che (come il mio amministratore di sistema mi ha assicurato) non utilizza un server proxy di alcun tipo.

Il PHP implementare il proprio meccanismo di caching? O che cosa altro potrebbe essere interferire qui?

(La mia soluzione attuale è quella di afferrare il file tramite exec ( 'wget --nocache ...') che funziona.)

È stato utile?

Soluzione

Dal momento che stai ricevendo il file tramite HTTP, sto supponendo che PHP sarà onorare eventuali intestazioni di cache il server risponde con.

Un modo molto semplice e sporco per evitare che è quello di aggiungere alcuni parametri get casuale per ogni richiesta.

Altri suggerimenti

Il Q relative al caching dei contenuti osservata accede da un fopen ( 'http: // ...') e il poster chiedeva se PHP implementare il proprio meccanismo di caching? Le altre risposte comprese alcune speculazioni, ma sicuramente il modo più semplice per scoprire è quello di verificare guardando il codice sorgente o forse più facile strumentazione il sistema chiama per vedere cosa sta succedendo? Questo è banale da fare su sistemi Debian come segue:

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

Ho incluso il relativo estratto del registro strace di sotto, ma ciò che questo dimostra è il PHP RTS si collega semplicemente a localhost: 80 , invia un "GET /xx.txt", ottiene un risposta che comprende intestazioni e il contenuto del file, che fa eco poi a STDOUT.

Assolutamente no cache sul lato client avviene all'interno del PHP RTS, e dal momento che questo sta facendo diretto dialogo presa HTTP, è difficile immaginare dove la cache potrebbe verificarsi sul client. Siamo lasciati con la possibilità di lato server o caching proxy intermedio. (Nota I DEFAULT a una scadenza di accesso + 7 giorni su file txt).

Logfile estratto

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

Quindi, se ti sto comprensione correttamente, parte del problema potrebbe essere che il file .dat * ha sempre un timestamp di 1:00? Hai il controllo del server che contiene i dati (http://www.iac.ethz.ch/php/chn_meteo_roof/)? Se è così, si dovrebbe cercare di scoprire perché i dati ha sempre lo stesso timestamp. Devo credere che si sta volutamente impostato - il sistema operativo aggiornerà il timestamp quando il file viene modificato a meno che non si va fuori del vostro modo di fare che non farlo. Se non si riesce a capire il motivo per cui è stato impostato a 1:00, si potrebbe almeno fare un "tocco" di comando sul file, che aggiornerà è modificato timestamp.

Questo è tutto, naturalmente, a patto di avere un po 'di accesso al server che fornisce i file.

Perché non provare a utilizzare ricciolo , credo che questo sia un uso più adeguato per questo.

Forse questo può risolvere il problema (richiesta POST non può essere memorizzato nella cache, per quanto ne so)

$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);
*/
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top