如果多次打开php://temp
(或php://memory
)文件,句柄是否会指向同一个文件?或者每个句柄都是独一无二的?
我在php文档中找不到答案,所以我要去write up a test script to find out。我认为值得在这里询问,以便其他人可以轻松找到答案。
答案 0 :(得分: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);
这不是显式记录在任何地方,但它隐含在流和包装器的文档中。
从官方的php documentation on streams来看,很明显,对于流的标准情况,每个文件句柄都与它自己的独立流相关联。
在documentation on IO stream wrappers中,它列出了可能的包装器,注意到它们发生时的异常。前三个(stdin,stdout,stderr)列出了一个例外:
php:// stdin,php:// stdout和php:// stderr允许直接访问 PHP进程的相应输入或输出流。流 引用重复的文件描述符,所以如果你打开php:// stdin和 稍后关闭它,你只关闭描述符的副本 - 实际 STDIN引用的流不受影响。
但是没有为php://temp
或php://memory
列出此类例外。因此,它可以像普通的独立流一样工作。
此外,这些页面上有一些评论进一步暗示了这些流的独立性。
答案 1 :(得分:1)
我的测试代码:
$f1 = fopen('php://temp', 'rw');
$f2 = fopen('php://temp', 'rw');
fputs($f1, "File One");
fputs($f2, "File Two");
rewind($f1);
echo "First line from F1: ";
echo fgets($f1) . PHP_EOL;
echo "Second line from F1: ";
echo fgets($f1) . PHP_EOL;
fclose($f1);
rewind($f2);
echo "First line from F2: ";
echo fgets($f2) . PHP_EOL;
echo "Second line from F2: ";
echo fgets($f2) . PHP_EOL;
fclose($f2);
结果:
First line from F1: File One
Second line from F1:
First line from F2: File Two
Second line from F2: