在阅读/书写文档时遇到问题php://temp 流动
我在读写在阅读/书写文档时遇到问题php://temp 流动,php,stream,Php,Stream,我在读写php://tempPHP 5.3.2中的流 我基本上有: file_put_contents('php://temp/test', 'test'); var_dump(file_get_contents('php://temp/test')); 我得到的唯一输出是string(0)“ 我不应该拿回我的“测试”吗?php://temp不是文件路径,它是一个伪协议,在使用时总是创建一个新的随机临时文件。实际上,/test被完全忽略了。唯一的额外“参数”是php://temp包装器接受的是
php://temp
PHP 5.3.2中的流
我基本上有:
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);
每次使用fopen获取处理程序时,请参见php://temp 将被冲洗。使用rewind()和stream_get_contents()获取内容。或者,使用普通的缓存,比如APC或memcache:)我知道这已经很晚了,但是除了@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
终于找到了一张记录在案的小纸条,这就解释了原因 使用了几乎完全相同的代码示例 php://memory 及php://temp 不可重复使用,即在流之后 已经关闭,无法再次参考它们
file_put_contents('php://memory', 'PHP');
echo file_get_contents('php://memory'); // prints nothing
我猜这意味着
file\u put\u contents()
在内部关闭流,这使得file\u get\u contents()
无法再次恢复流中的数据找到了我需要的内容-使用vfsstream为什么声明file\u put\u contents()
可以像fopen()一样接受url包装器
@accountaryم…——@deceze“只是这个特殊的包装器以一种非常特殊的方式运行”是的,我终于在手册中找到了一个,它使用了与问题中完全相同的代码示例,并解释了php://temp
和php://memory
不可重复使用。我猜他们的意思是,一旦file\u put\u contents()
在内部关闭流,我就无法通过file\u get\u contents()
再次获得它。作为旁注,您可以使用stream\u get\u contents($stream,-1,0)
隐式回放
。它将从一开始读取整个流。