todas - sintaxis php
¿Funciona la función fox de PHP para implementar algún tipo de caché? (5)
Estoy luchando con la recopilación automatizada de datos de un script PHP de un servidor web. Los archivos en cuestión contienen datos meteorológicos y se actualizan cada 10 minutos. Curiosamente, la fecha del "archivo modificado" en el servidor web no cambia.
Un comando simple fopen (''http: // ...'') intenta obtener la versión más reciente del último archivo en este directorio cada hora. Pero regularmente termino con una versión de hasta 4 horas de antigüedad. Esto sucede en un servidor Linux que (como el administrador de mi sistema me ha asegurado) no usa un servidor proxy de ningún tipo.
¿Implementa PHP su propio mecanismo de almacenamiento en caché? ¿O qué más podría estar interfiriendo aquí?
(Mi solución actual es tomar el archivo a través de exec (''wget --nocache ...'') que funciona.)
¿Por qué no pruebas usar curl ? Creo que este es un uso más adecuado para esto.
Como obtiene el archivo a través de HTTP, asumo que PHP cumplirá con los encabezados de caché con los que responde el servidor.
Una forma muy simple y sucia de evitar eso es agregar algún parámetro de obtención aleatoria a cada solicitud.
tal vez esto pueda resolver su problema (la solicitud POST no se puede almacenar en la memoria caché hasta donde yo 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);
*/
Entonces, si lo entiendo correctamente, parte del problema podría ser que el archivo * .dat siempre tiene una marca de tiempo de 1:00 AM? ¿Tiene control del servidor que contiene los datos ( http://www.iac.ethz.ch/php/chn_meteo_roof/
)? Si es así, debe intentar averiguar por qué los datos siempre tienen la misma marca de tiempo. Tengo que creer que se está configurando intencionalmente: el sistema operativo actualizará la marca de tiempo cuando se modifique el archivo, a menos que se salga de su camino para que no lo haga. Si no puede entender por qué se establece en 1AM, al menos puede hacer un comando "toque" en el archivo, que actualizará su marca de tiempo modificada.
Esto es todo, por supuesto, suponiendo que tiene acceso al servidor que proporciona los archivos.
La Q se relacionó con el almacenamiento en memoria caché del contenido al que accedió fopen (''http: // ...'') y el póster se preguntó si PHP implementaría su propio mecanismo de almacenamiento en caché. Las otras respuestas incluyeron algunas especulaciones, pero seguramente la forma más fácil de averiguarlo es verificando el código fuente o quizás instrumentando las llamadas al sistema para ver qué está sucediendo. Esto es trivial en los 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 relevante del registro strace a continuación, pero lo que muestra es que PHP RTS simplemente se conecta a localhost: 80 , envía un "GET /xx.txt", obtiene una respuesta que comprende encabezados y contenido de archivo que luego hace eco a STDOUT.
Absolutamente no hay caché del lado del cliente dentro de PHP RTS, y como esto está haciendo un diálogo de socket HTTP directo, es difícil imaginar dónde podría ocurrir el almacenamiento en caché en el cliente. Nos queda la posibilidad de un caché de proxy intermedio o del lado del servidor. (Tenga en cuenta que de forma predeterminada caduca de Access + 7 días en archivos txt).
Logfile Extract
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