当php:// temp被多次打开时会发生什么?

Tim*_*tle 7 php file

如果多次打开php://temp(或php://memory)文件,句柄是否指向同一个文件?或者每个句柄都是独特的吗?

我在php文档中找不到答案,所以我要编写一个测试脚本来查找.我认为值得在这里询问,以便其他人可以轻松找到答案.

Ben*_*Lee 6

每个句柄指向一个独立的流.例:

$a = fopen('php://memory', 'w+');
$b = fopen('php://memory', 'w+');

fwrite($a, 'foo');
fwrite($b, 'bar');

rewind($a);
rewind($b);

$a_text = stream_get_contents($a);  //=> "foo"
$b_text = stream_get_contents($b);  //=> "bar"

fclose($a);
fclose($b);
Run Code Online (Sandbox Code Playgroud)

这没有在任何地方明确记录,但它隐含在流和包装器的文档中.

流上的官方php文档来看,很明显,对于流的标准情况,每个文件句柄都与它自己的独立流相关联.

在IO流包装器文档中,它列出了可能的包装器,注意到它们发生时的异常.前三个列出了一个例外(stdin,stdout,stderr):

php:// stdin,php:// stdout和php:// stderr允许直接访问PHP进程的相应输入或输出流.流引用了重复的文件描述符,因此如果打开php:// stdin并稍后关闭它,则只关闭描述符的副本 - STDIN引用的实际流不受影响.

但是没有列出这样的例外php://tempphp://memory.因此,它们可以像普通的独立流一样工作.

此外,这些页面上还有一些评论进一步暗示了这些流的独立性.