我在 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