Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在阅读/书写文档时遇到问题php://temp 流动_Php_Stream - Fatal编程技术网

在阅读/书写文档时遇到问题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)
隐式回放
。它将从一开始读取整个流。