PHPSのfopen関数は、キャッシュのいくつかの種類を実装していますか?

StackOverflow https://stackoverflow.com/questions/511476

  •  21-08-2019
  •  | 
  •  

質問

私は、WebサーバからのPHPスクリプトの自動データ収集に苦労しています。問題のファイルはメテオのデータが含まれていると10分ごとに更新されます。不気味なことに、ウェブサーバ上の「ファイル変更」の日付は変更されません。

簡単なのfopen の( 'のhttp://は...')-command取得しようとしますこのディレクトリの最後のファイルの新鮮なバージョン毎時間。しかし、定期的に、私は最大4時間の古いバージョンで終わります。これは、あらゆる種類のプロキシサーバーを使用していない(私のシステム管理者が私を保証したように)Linuxサーバ上で行われます。

PHPは、独自のキャッシュメカニズムを実装していますか?それとも他に何がここに妨害されるだろうか?

(私の現在の回避策が機能のexec( 'wgetの--nocache ...')を介してファイルをつかむことです。)

役に立ちましたか?

解決

は、HTTP経由でファイルを取得しているので、私はPHPはサーバーの応答しているすべてのキャッシュ・ヘッダーを尊重されることを想定しています。

それを避けるために、非常にシンプルかつ汚い方法は、各リクエストにいくつかのランダムなGETパラメータを追加することです。

他のヒント

観測されたのfopenによってアクセスされるコンテンツのキャッシング(「のhttp:// ...」)に関連するQとポスターは、PHPは、独自のキャッシュメカニズムを実装するかどうかだろうか?他の回答には、いくつかの憶測を含め、しかし確実に見つけるための最も簡単な方法は、ソースコードを見たり、おそらく簡単にシステムを計測することによって確認することで何が起こっているかを確認するために呼び出しますか?これは、次のようにDebianシステム上で行うことは簡単です。

$ 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 を送信し、取得する「/xx.txt GET」ヘッダと、それはその後、STDOUTにエコーファイルの内容を含んで応答。

絶対にクライアント側のキャッシュは、PHP RTS以内に発生していない、これは直接HTTPソケットの対話を行っているので、キャッシュは、クライアント上で発生する可能性がある場所を想像するのは難しいです。私たちは、サーバー側または中間プロキシキャッシングの可能性が残されています。 (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:00のタイムスタンプを持っていることかもしれませんか?あなたはデータを含むサーバー(http://www.iac.ethz.ch/php/chn_meteo_roof/)の制御を持っていますか?もしそうなら、あなたは、データが常に同じタイムスタンプを持っている理由を見つけるようにしてください。私はそれが意図的に設定されていると信じてする必要があります - ファイルが変更されたとき、あなたはそれがそうではない作るためにあなたの道を行くしない限り、OSは、タイムスタンプを更新します。それは1AMに設定されている理由を理解することはできません場合は、少なくともそれがタイムスタンプを変更しています更新しますファイル、上のコマンドを「タッチ」行うことができます。

このはすべて、もちろん、あなたがファイルを提供するサーバへのいくつかのアクセス権を持っていると仮定されます。

カールに使用してみてくださいいけない理由

、私はこれが、このため、より適切な使用だと思います。

多分これはあなたの問題を解決することができます。

(POSTリクエストは限り私は知ってキャッシュすることはできません)
$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