我在PHP 5.3.2中读取和编写php://temp
流时遇到问题
我基本上有:
file_put_contents('php://temp/test', 'test');
var_dump(file_get_contents('php://temp/test'));
我得到的唯一输出是string(0) ""
我不应该回到'测试'吗?
答案 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()
无法再次恢复流中的数据