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



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

我基本上有:

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

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

我不应该拿回我的"测试"吗?

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

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

终于找到了一个有记录的小纸条,解释了为什么

PHP 手册中的示例 5 使用了几乎完全相同的代码示例,并说

php://memory 和 php://temp 不可重复使用,即在流之后 已经关闭,没有办法再次引用它们。

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

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

我知道

这已经晚了,但除了@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

相关内容

  • 没有找到相关文章

最新更新