Pregunta

Estoy luchando con la captura automática de datos de un script PHP desde un servidor web. Los archivos en cuestión contienen datos meteo y se actualizan cada 10 minutos. Extrañamente suficiente, el 'archivo modificado' fecha en la que el servidor web no cambia.

Un simple fopen ( 'http: // ...') -command intenta la versión más fresca del último archivo en este directorio cada hora. Pero regularmente termino con una versión hasta 4 horas de vida. Esto sucede en un servidor Linux que (como mi administrador de sistema me ha asegurado) no utiliza un servidor proxy de ningún tipo.

¿Tiene PHP implementa su propio mecanismo de caché? O ¿qué otra cosa podría ser interfiriendo aquí?

(Mi solución actual es para agarrar el archivo a través de exec ( 'wget --nocache ...') que funciona.)

¿Fue útil?

Solución

Desde que está recibiendo el archivo a través de HTTP, estoy suponiendo que PHP rendirá homenaje a cualquiera de las cabeceras de caché del servidor está respondiendo con.

Una forma muy simple y sucia para evitar que se va a añadir algún parámetro get al azar a cada solicitud.

Otros consejos

La Q relacionada con el almacenamiento en caché observada de los contenidos accesibles por un fopen ( 'http: // ...') y el cartel se preguntó si PHP implementa su propio mecanismo de caché? Las otras respuestas incluyeron algunas especulaciones, pero sin duda la forma más fácil de averiguar es comprobar mirando el código fuente o tal vez más fácil instrumentar el sistema llama para ver lo que está pasando? Esto es trivial que hacer en sistemas Debian de la siguiente manera:

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

He incluido el extracto correspondiente del registro strace a continuación, pero lo que esta muestra es la del PHP RTS simplemente se conecta a localhost: 80 , envía una "GET /xx.txt", para crear una la respuesta que comprende las cabeceras y el contenido del archivo que luego se hace eco de la salida estándar.

Absolutamente ninguna caché del cliente se produce dentro de la estrategia en tiempo real PHP, y puesto que esto está haciendo un diálogo directo zócalo de HTTP, es difícil imaginar donde podría ocurrir el almacenamiento en caché en el cliente. Nos quedamos con la posibilidad de servidor o almacenamiento en caché de proxy intermedio. (Nota I predeterminada apunta a un caduca de Access + 7 días en archivos txt).

Extracto del archivo de registro

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

Así que si te estoy entendiendo correctamente, parte del problema podría ser que el archivo * .dat siempre tiene una marca de tiempo desde 1:00 am? ¿Tiene el control del servidor que contiene los datos (http://www.iac.ethz.ch/php/chn_meteo_roof/)? Si es así, usted debe tratar de descubrir por qué los datos siempre tiene la misma marca de tiempo. Tengo que creer que se está creando intencionadamente - el sistema operativo se actualizará la fecha y hora cuando se modifica el archivo menos que salir de su manera de hacer que no lo haga. Si no puede averiguar por qué se establece en 01 a.m., al menos podrías hacer un "toque" de comando en el archivo, lo que permitirá actualizar se modifica marca de tiempo.

Esto es, por supuesto, suponiendo que tiene algún tipo de acceso al servidor que proporciona los archivos.

¿Por qué no intentes usar rizo , creo que este es un uso más adecuado para ello.

Tal vez esto puede resolver su problema (solicitud POST no puede ser almacenado en caché por lo que sé)

$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);
*/
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top