Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.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:接收和存储大型二进制数据_Php_Binary - Fatal编程技术网

PHP:接收和存储大型二进制数据

PHP:接收和存储大型二进制数据,php,binary,Php,Binary,我的PHP脚本正在从客户端接收大数据(100-500 MB)。我希望我的PHP脚本运行快,而不使用太多的内存 为了节省流量,我不使用Base64或表单数据。我在POST请求中直接发送二进制数据 数据由两部分组成:2000字节的头文件,其余部分必须作为文件存储在服务器上 $fle = file_get_contents("php://input",FALSE,NULL,2000); file_put_contents("file.bin", $fle); 问题是,file\u get\u con

我的PHP脚本正在从客户端接收大数据(100-500 MB)。我希望我的PHP脚本运行快,而不使用太多的内存

为了节省流量,我不使用Base64或表单数据。我在POST请求中直接发送二进制数据

数据由两部分组成:2000字节的头文件,其余部分必须作为文件存储在服务器上

$fle = file_get_contents("php://input",FALSE,NULL,2000);
file_put_contents("file.bin", $fle);
问题是,
file\u get\u contents
忽略偏移量参数,并从字节0读取数据。有没有更好的办法


**我不想读取整个数据并切掉最后的N-2000字节,因为我担心这会占用太多内存。

使用较低级别的文件IO函数,一次读取/写入一点

$bufsz = 4096;

$fi = fopen("php://input", "rb");
$fo = fopen("file.bin", "wb");

fseek($fi, 2000);

while( $buf = fread($fi, $bufsz) ) {
  fwrite($fo, $buf);
}

fclose($fi);
fclose($fo);

这将以4kB的数据块进行读/写。

substr($fle,2000)
首先不要创建另一个变量-$fle-
file\u put\u contents(“file.bin”),file\u get\u contents(“php://input“,FALSE,NULL,2000”)@accountaryم在刷新到磁盘之前仍然会将所有内容读取到内存中。@Sammitch是的,我知道,这只会阻止在内存中创建另一个数据副本。对了,我也做了类似的缓冲@accountaryم啊,我误读了你之前的评论。它应该是1x,有或没有变量赋值。需要注意的是,这是您的执行时间-确保您已经在php ini中设置了它。伟大的答案与解释虽然!不知道可以指定一致读取的大小,始终使用
filesize()
作为第二个参数。很高兴知道,以备将来参考。顺便说一句。是否有一种从
$fi
读取N字节的简单方法?在我的例子中,fread()通常返回的值小于第二个参数的值。@IvanKuckir每个文件最多只能返回一次,并且只有在缓冲区大小不是偶数倍的情况下,才会在文件末尾返回。这很好。任何其他观察到的情况都是需要解决的不同问题。@Sammitch我用$bufsz=1000000运行了您的代码;(大于我的文件大小)。文件已保存,但一次读取的字节数不会超过8192。@IvanKuckir
php://input
是一个特殊的流,可能有一些与之相关的特性。除非出于某种原因需要在内存中保存约1MB的数据,否则8192字节或更小的缓冲区应该可以正常工作。