문제

웹 서버에서 PHP 스크립트의 자동 데이터 수집으로 어려움을 겪고 있습니다. 문제의 파일 Meteo 데이터를 포함하고 10 분마다 업데이트됩니다. 이상하게도 웹 서버의 '파일 수정 된'날짜는 변경되지 않습니다.

간단한 포펜( 'http : // ...')-명령은 매시간이 디렉토리에서 마지막 파일의 가장 신선한 버전을 얻으려고합니다. 그러나 정기적으로 나는 최대 4 시간의 버전으로 끝납니다. 이것은 (내 시스템 관리자가 나에게 보증했듯이) Linux 서버에서 발생합니다.

PHP는 자체 캐싱 메커니즘을 구현합니까? 아니면 여기서 무엇이 방해 될 수 있습니까?

(현재의 해결 방법은 Exec ( 'wget -nocache ...')을 통해 파일을 잡는 것입니다.)

도움이 되었습니까?

해결책

HTTP를 통해 파일을 받고 있으므로 PHP가 서버가 응답하는 캐시 헤더를 존중한다고 가정합니다.

이를 피하는 매우 간단하고 더러운 방법은 각 요청에 임의의 get 매개 변수를 추가하는 것입니다.

다른 팁

fopen ( 'http : // ...')에 의해 액세스 된 컨텐츠의 관찰 된 캐싱과 관련된 Q와 포스터는 PHP가 자체 캐싱 메커니즘을 구현하는지 궁금했습니다. 다른 답변에는 약간의 추측이 포함되었지만, 가장 쉬운 방법은 소스 코드를 보거나 시스템 호출을 더 쉽게 계기하여 무슨 일이 일어나고 있는지 확인하여 확인하는 것입니다. 이것은 다음과 같이 데비안 시스템에서해야 할 일입니다.

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

아래에 Strace 로그의 관련 추출물을 포함 시켰지만이 표시는 PHP RTS가 단순히 연결하는 것입니다. 로컬 호스트 : 80, "get /xx.txt"를 보내고, 헤더와 파일 내용으로 구성된 응답을 얻은 다음 STDOUT로 반영됩니다.

PHP RTS 내에서 클라이언트 측 캐싱이 발생하지 않으며 직접 HTTP 소켓 대화를 수행하기 때문에 클라이언트에서 캐싱이 발생할 수있는 위치를 상상하기가 어렵습니다. 우리는 서버 측 또는 중간 프록시 캐싱 가능성이 남아 있습니다. (참고 i txt 파일에서 액세스 + 7 일 만료되는 기본값).

로그 파일 추출물

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

그래서 내가 당신을 올바르게 이해한다면, 문제의 일부는 *.dat 파일의 타임 스탬프가 항상 오전 1 시가된다는 것입니다. 데이터가 포함 된 서버를 제어하고 있습니까 (http://www.iac.ethz.ch/php/chn_meteo_roof/)? 그렇다면 데이터가 항상 동일한 타임 스탬프를 갖는 이유를 찾아야합니다. 나는 그것이 의도적으로 설정되고 있다고 믿어야한다.-당신이 그렇게하지 않기 위해 당신의 길을 벗어나지 않는 한 파일을 수정할 때 OS는 타임 스탬프를 업데이트한다. 왜 오전 1 시로 설정되는지 알 수 없다면 파일에서 "터치"명령을 수행 할 수 있으며, 이로 인해 수정 된 타임 스탬프가 업데이트됩니다.

물론 이것은 파일을 제공하는 서버에 액세스 할 수 있다고 가정합니다.

왜 사용해 보지 마십시오 곱슬 곱슬하다, 나는 이것이 이것에 더 적절한 용도라고 생각합니다.

어쩌면 이것은 문제를 해결할 수 있습니다 (내가 아는 한 사후 요청을 캐시 할 수 없습니다).

$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);
*/
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top