什么时候发生php://temp 是否多次打开?
如果什么时候发生php://temp 是否多次打开?,php,file,Php,File,如果php://temp(或php://memory)文件被多次打开,句柄是否指向同一个文件?或者每个句柄都是唯一的 我在php文档中找不到答案,所以我将继续。我觉得在这里询问是值得的,这样其他人就可以很容易地找到答案。每个句柄都指向一个独立的流。例如: $a = fopen('php://memory', 'w+'); $b = fopen('php://memory', 'w+'); fwrite($a, 'foo'); fwrite($b, 'bar'); rewind($a); re
php://temp
(或php://memory
)文件被多次打开,句柄是否指向同一个文件?或者每个句柄都是唯一的
我在php文档中找不到答案,所以我将继续。我觉得在这里询问是值得的,这样其他人就可以很容易地找到答案。每个句柄都指向一个独立的流。例如:
$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);
这在任何地方都没有明确的文档记录,但在流和包装器的文档中是隐式的
一般来说,对于流的标准情况,每个文件句柄都与它自己的独立流相关联
在中,它列出了可能的包装器,在异常发生时记录它们。前三个(stdin、stdout、stderr)列出了一个例外情况:
php://stdin, php://stdout 及php://stderr 允许直接访问
PHP进程的相应输入或输出流。小溪
引用重复的文件描述符,因此如果打开php://stdin 和
稍后关闭它,您将只关闭描述符的副本
STDIN引用的流不受影响
但php://temp
或php://memory
。因此,它们将像正常的独立流一样工作
此外,这些页面上的一些注释进一步暗示了这些流的独立性。我的测试代码:
$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:
的确刚刚测试并发现-有任何指向某个地方记录的链接吗?至少没有说任何其他内容,但因为这不是你的答案,好吧,你需要检查:)@hakre是的,这似乎是它应该做的-但我认为它应该记录在某个地方。@TimLytle,它是记录的。我会用相关的文档更新我的帖子。@BenLee谢谢你的解释。你认为文件句柄是用来做什么的?@hakre但是如果我打开
/data/test.txt
两次,我会使用同一个文件-对吗?它也没有文档记录,对吗?;)@hakre在大多数其他情况下,这似乎是显而易见的——文件系统中的文件将是相同的数据,php://output
将是同一个流,在这种情况下,它似乎应该是不同的(每个“开放”都是唯一的),但由于它是不同的,我认为这不是显而易见的。我不介意测试,但我想如果其他人对同样的事情感到好奇,这会很好。我想可以问一下,很高兴看到你的反馈:)