简体   繁体   中英

Does PHP's http stream wrapper cache files? Details?

I'm looking for information about if and how PHP's http stream wrapper attempts cache files. Can anyone point to information about this?

An answer to this question, Does PHPs fopen function implement some kind of cache? , suggests that the wrapper may attempt to honor cache headers, but I have not found anything in the documentation about this.

Specifically I'm wondering:

  • Will PHP cache files accessed http:// urls.
  • If it does, how long will it keep them?
  • Is there a maximum size for the cache?
  • Is there a maximum size per file that it will cache?
  • Does the cache persist between requests?
  • Out of curiosity, does it cache in memory or on disk? Where?

Short response: Q1 No. Q2-5 Not applicable.

Longer response: The answers in Does PHPs fopen function implement some kind of cache? are wrong -- at least for Linux and since this PHP codebase is common for WinXXX as well.

This was counter to my understanding so I checked rather than guessing by doing:

$ 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

and looking at the system trace log. Here is the relevant cut:

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

A GET request to localhost, a response, a echo to STDOUT and shutdown. No caching. Nada. Sorry.

The best way to get a definitive answer to this question is to look at the source.

/ext/standard/http_fopen_wrapper.c is where the http fopen wrapper is defined.

There is no caching here whatsoever. Every request is composed of a manually assembled HTTP request made over a socket, not relying at all on any third party code which might add caching unknowingly.

I have never encountered a situation where I felt it cached anything. Caching is something you should implement at the application level. There are also other libraries built on top of the stream API out there that may do it for you.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM