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

时间:2011-10-10 22:26:07

标签: php file

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

我在php文档中找不到答案,所以我要去write up a test script to find out。我认为值得在这里询问,以便其他人可以轻松找到答案。

2 个答案:

答案 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://tempphp://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: