Pergunta

Eu estou lutando com a coleta automatizada de dados de um script PHP a partir de um servidor web. Os arquivos em questão contêm dados meteo e são atualizados a cada 10 minutos. Estranhamente, o 'arquivo modificado' data no servidor web não muda.

Um simples fopen ( 'http: // ...') -Command tentativas para obter a versão mais frescos do último arquivo nesse diretório a cada hora. Mas regularmente eu acabar com uma versão até 4 horas de idade. Isso acontece em um servidor Linux que (como o meu administrador do sistema assegurou-me) não utilizar um servidor proxy de qualquer tipo.

O PHP implementar o seu próprio mecanismo de cache? Ou o que mais poderia estar interferindo aqui?

(Minha solução atual é a de pegar o arquivo via exec ( 'wget --nocache ...') que funciona.)

Foi útil?

Solução

Uma vez que você está recebendo o arquivo via HTTP, eu estou supondo que o PHP será honrar quaisquer cabeçalhos de cache o servidor está respondendo com.

Uma maneira muito simples e sujo para evitar que é acrescentar algum parâmetro get aleatória para cada solicitação.

Outras dicas

O Q relacionado a um cache observado de conteúdo acessado por um fopen ( 'http: // ...') eo cartaz perguntava se PHP implementar o seu próprio mecanismo de cache? As outras respostas incluíram alguma especulação, mas certamente a maneira mais fácil de descobrir é verificar, olhando para o código-fonte ou talvez mais fácil instrumentar as chamadas de sistema para ver o que está acontecendo? Esta é trivial fazer em sistemas Debian o seguinte:

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

Eu incluí o extrato relevante do log de strace abaixo, mas o que isto mostra é a do PHP RTS simplesmente se conecta ao localhost: 80 , envia um "GET /xx.txt", recebe uma resposta compreendendo cabeçalhos e conteúdo de arquivo que ele, em seguida, ecos para STDOUT.

Absolutamente nenhum cache do lado do cliente ocorre dentro do PHP RTS, e uma vez que este está fazendo diálogo tomada HTTP direta, é difícil imaginar onde caching poderia ocorrer no cliente. Ficamos com a possibilidade de server-side ou cache proxy intermediário. (Nota I padrão a um expira do acesso + 7 dias em arquivos txt).

Logfile Extrair

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

Então, se eu estou entendendo corretamente, parte do problema pode ser que o arquivo * .dat sempre tem um timestamp de 1:00? Você tem o controle do servidor que contém os dados (http://www.iac.ethz.ch/php/chn_meteo_roof/)? Se assim for, você deve tentar descobrir por que os dados sempre tem o mesmo timestamp. Eu tenho que acreditar que está sendo intencionalmente - o sistema operacional irá atualizar o timestamp quando o arquivo é modificado a menos que você sair do seu caminho para torná-lo não fazê-lo. Se você não consegue descobrir por que ele está sendo definido para 1:00, você poderia pelo menos fazer um comando "toque" no arquivo, que irá atualizar é modificado timestamp.

Isso é tudo, é claro, supondo que você tenha algum acesso ao servidor que fornece os arquivos.

Por que não tentar usar onda , penso que esta é uma utilização mais adequada para isso.

talvez isso pode resolver o seu problema (pedido POST não pode ser armazenado em cache como agora eu sei)

$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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top