如果使用PHP从CLI打开文件并检索文件描述符:
$fp = fopen("somefile", "r");
echo 0 + $fp; 在Apache中运行mod_php,得到了预期的3。我知道0是STDIN,1是STDOUT,2是STDERR,但是当我试图打开php://fd/3和php://fd/4时,会发现一个错误,表明它们不存在。
无论我是在磁盘上还是php://memory上尝试一个文件,而不是somefile,结果都不会改变。如果我使用php -r或php x.php,它也不会改变。
那么文件描述符3和4会发生什么呢?是否有一些有趣的特性潜伏在我不知道的地方,某种流包装器只存在于某些情况下?
发布于 2015-06-30 03:45:13
没什么。它是文件描述符3,正如您所想的那样。
strace -etrace=open php -r '$fp = fopen("somefile", "r"); echo 0 + $fp;'
[…]
open("/home/username/somefile", O_RDONLY) = 3
5+++ exited with 0 +++强制PHP资源(如文件句柄)为整数提供PHP资源标识符,而不是文件描述符。从1开始分配资源号,而不是从0开始;在CLI中运行时,前三个总是分配给STDIN、STDOUT和STDERR流。虽然有一些与文件描述符的对应关系,但当您开始考虑非文件资源(如MySQL结果或没有文件句柄支持的流)(如内存或复杂包装器)时,这是巧合的。
(我不知道在CLI下第四个资源用于什么。无法通过其ID获取资源,因此很难发现它是什么。)
https://stackoverflow.com/questions/31129068
复制相似问题