bkit
bkit

Reputation: 281

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:

Upvotes: 3

Views: 820

Answers (3)

Charles
Charles

Reputation: 51411

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.

Upvotes: 3

TerryE
TerryE

Reputation: 10888

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.

Upvotes: 10

Louis-Philippe Huberdeau
Louis-Philippe Huberdeau

Reputation: 5431

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.

Upvotes: 0

Related Questions