2012-02-14 8 views
3

私はPHPのhttpストリームラッパーがキャッシュファイルを試みるかどうかについての情報を探しています。誰もこれについての情報を指すことができますか?PHPのHTTPストリームラッパーキャッシュファイルはありますか?詳細は?

この質問の回答Does PHPs fopen function implement some kind of cache?は、ラッパーがキャッシュヘッダーを尊重しようとしている可能性があることを示唆していますが、ドキュメントではこれについて何も見つかりませんでした。

具体的に私は思ったんだけど:

  • ウィルPHPキャッシュファイルアクセスのhttp:// URLを。
  • もしそうなったら、どれくらいの時間それらを保持しますか?
  • キャッシュの最大サイズはありますか?
  • キャッシュするファイルごとに最大サイズはありますか?
  • キャッシュは要求間で持続しますか?
  • 好奇心ではなく、メモリやディスクにキャッシュされますか?どこ?

答えて

9

短い応答:Q1番号Q2-5該当しません。

回答時間:Does PHPs fopen function implement some kind of cache?の答えは間違っています - 少なくともLinuxではこのPHPコードベースはWinXXXでもよくあります。

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

をし、システムトレースログを見て:私がチェックではなく、実行して推測して

この

は、私の理解にカウンターでした。

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 

GET要求がローカルホストに応答し、STDOUTにエコーしてシャットダウンします。キャッシングなし。ナダ。ごめんなさい。

+2

+1、トレースツールを破ることは、ソースダイビングよりもはるかに悪いことです。 – Charles

+0

私はこれを別の方法でもテストしました。私はカウンタをインクリメントしたPHPスクリプトを作成し、file_get_contentsで複数回連続してアクセスするスクリプトを作成しました。このテストでは、要求がキャッシュされていないことも示されています。しかし、このようなことをテストするときは、常に偽陰性の可能性があります。特定の問題があるために今回はキャッシュを使用しなかったかもしれませんが、もう1度(たとえば、キャッシングが単一のphp invokation内でのみ機能し、localhostでは無効になるなど) – bkit

+0

とにかく、私たちのテストの両方にキャッシングが見られなかったことと、Charlesはキャッシング関連のコードが見つからなかったことを考えると、私はHTTPストリームラッパーがキャッシュしないと言っても安全だと思っています。今チャールズとテリー、私は質問が残っています:誰が答えるのですか? – bkit

0

私は何かがキャッシュされていると感じたことはありませんでした。キャッシングは、アプリケーションレベルで実装する必要があります。ストリームAPIの上に構築された他のライブラリも用意されています。

3

この質問に対する決定的な答えを得る最も良い方法は、ソースを見ることです。

/ext/standard/http_fopen_wrapper.cは、http fopenラッパーが定義されている場所です。

キャッシングなしここには何もありません。すべてのリクエストは、ソケットを介して手動で組み立てられたHTTPリクエストで構成されています。サードパーティのコードにはまったく依存せず、無意識にキャッシングを追加する可能性があります。

+0

多分straceが悪いですが、まだ多くの場合、何が起きているのかを知るためにダイビングを開始します。私は最近、[mod_write.c](http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/mappers/mod_rewrite.c)で多くのことをしてきました。ソースダイビングも。 :-) – TerryE

関連する問題