我正在寻找有关PHP的http流包装器是否以及如何尝试缓存文件的信息。任何人都可以指出这方面的信息吗?
这个问题的答案Does PHPs fopen function implement some kind of cache?表明包装器可能会尝试使用缓存标头,但我没有在文档中找到任何关于此问题的内容。
特别是我想知道:
答案 0 :(得分:9)
简短回复:Q1 No. 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
对localhost的GET请求,响应,对STDOUT的回应和关闭。没有缓存。纳达。遗憾。
答案 1 :(得分:3)
获得这个问题明确答案的最佳方法是查看来源。
/ext/standard/http_fopen_wrapper.c
是定义http fopen包装器的地方。
此处有无缓存。每个请求都是由通过套接字进行的手动组装的HTTP请求组成的,而不是完全依赖任何可能在不知情的情况下添加缓存的第三方代码。
答案 2 :(得分:0)
我从来没有遇到过这样的情况,我觉得它缓存了什么。缓存是您应该在应用程序级别实现的。还有其他库建立在流API之上,可以为您完成。