【发布时间】:2011-08-22 05:41:30
【问题描述】:
我在 PHP 5.3.2 中读取和写入 php://temp 流时遇到问题
我基本上有:
file_put_contents('php://temp/test', 'test');
var_dump(file_get_contents('php://temp/test'));
我得到的唯一输出是string(0) ""
我不应该拿回我的“测试”吗?
【问题讨论】:
我在 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
【讨论】:
file_put_contents() 可以像fopen() 一样接受url 包装器
file_put_contents 一起使用。
php://temp 和php://memory 不可重复使用。我猜他们的意思是一旦file_put_contents() 在内部关闭流,我就无法通过file_get_contents() 再次获得它。
每次使用 fopen 获取处理程序时,都会刷新 php://temp 的内容。使用 rewind() 和 stream_get_contents() 来获取内容。或者,使用普通的缓存器,例如 APC 或 memcache :)
【讨论】:
rewind 隐含地使用stream_get_contents($stream, -1, 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()无法再次恢复流中的数据
【讨论】:
我知道这已经晚了,但除了@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
【讨论】: