在读取/写入php://临时流时遇到问题

时间:2011-05-10 07:20:01

标签: php stream

我在PHP 5.3.2中读取和编写php://temp流时遇到问题

我基本上有:

file_put_contents('php://temp/test', 'test');
var_dump(file_get_contents('php://temp/test'));

我得到的唯一输出是string(0) ""

我不应该回到'测试'吗?

4 个答案:

答案 0 :(得分:21)

php://temp不是文件路径,它是一种伪协议,在使用时始终会创建一个新的随机临时文件。 /test实际上完全被忽略了。 php://temp包装器接受的唯一额外“参数”是/maxmemory:n。您需要将文件句柄保持在打开的临时流中,否则它将被丢弃:

$tmp = fopen('php://temp', 'r+');
fwrite($tmp, 'test');
rewind($tmp);
fpassthru($tmp);
fclose($tmp);

请参阅http://php.net/manual/en/wrappers.php.php#refsect1-wrappers.php-examples

答案 1 :(得分:9)

每次使用fopen获取处理程序时,php:// temp的内容都会被刷新。使用rewind()和stream_get_contents()来获取内容。或者,使用普通的cachers,如APC或memcache:)

答案 2 :(得分:0)

我知道这很晚了,但是除了@OZ_的答案,我还发现倒带后'fread'也可以使用。

$handle = fopen('php://temp', 'w+');

fwrite($handle, 'I am freaking awesome');

fread($handle); // returns '';

rewind($handle); // resets the position of pointer

fread($handle, fstat($handle)['size']); // I am freaking awesome

答案 3 :(得分:0)

最后找到了一个记录在案的小笔记,解释了为什么

Example 5 at the PHP Manual使用了几乎完全相同的代码示例并说

  

php:// memory和php:// temp不可重用,即在流之后   已关闭,无法再次引用它们。

file_put_contents('php://memory', 'PHP');
echo file_get_contents('php://memory'); // prints nothing

我猜这意味着file_put_contents()在内部关闭流,这使得file_get_contents()无法再次恢复流中的数据