php - PHP 的 http 流包装器是否缓存文件?细节?

标签 php

我正在寻找有关 PHP 的 http 流包装器是否以及如何尝试缓存文件的信息。任何人都可以指出有关此的信息吗?

这个问题的答案,Does PHPs fopen function implement some kind of cache? ,表明包装器可能会尝试接受缓存 header ,但我在文档中没有找到任何关于此的信息。

我特别想知道:

  • PHP 会缓存文件访问 http://urls。
  • 如果是,它们会保留多长时间?
  • 缓存是否有最大大小?
  • 缓存的每个文件是否有最大大小?
  • 缓存是否在请求之间持续存在?
  • 出于好奇,它是缓存在内存中还是磁盘上?在哪里?

最佳答案

简短回复: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

对本地主机的 GET 请求、响应、对 STDOUT 的回显和关闭。没有缓存。纳达。对不起。

关于php - PHP 的 http 流包装器是否缓存文件?细节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9285640/

相关文章:

php - 使用 SQL 查找最近的位置

php - 数据未正确显示

php - MySQL - 无法添加外键约束 - 拉丁文/西里尔文

php - Joomla 升级数据库错误从 v3.1.1 到 3.1.5

php - ZF2 控制台路由无限参数

php - Magento 通过 phtml 文件中的 anchor 标记调用 cms 页面

php - 在 Scriptaculous 中传递自动完成中的 ID 值

php - a href 不适用于 mpdf 中的动态 url

php - 使用 PHP、AJAX 和 MYSQL 进行高级搜索

javascript - 如何将 php 数组更改为 javascript 数组