从PHP标准输入保存大文件

3
请为我提供从php stdin保存大文件的最佳方法建议,内容涉及it技术。 iOS开发者向服务器发送大视频内容,我必须将其存储到文件中。
我阅读了带有视频数据的stdin线程,并将其写入文件。例如,可以通过以下方式实现:
$handle = fopen("php://input", "rb");    
while (!feof($handle)) {
      $http_raw_post_data .= fread($handle, 8192);
}

在IT技术中,使用哪种函数更好?是file_get_contents还是fread或其他函数?


4
如果您可以影响上传过程,我建议将其作为多部分表单数据发送。这样它将通过$_FILES可用,并且Web服务器本身会处理文件的上传并将其保存到文件系统中。这是最高效的方式。 - hek2mgl
hek2mgl,感谢您的回答。将来我们会尝试使用MIME功能重新制作上传过程,但现在我们想以这种方式完成它。 - Andrei Nikolaev
3个回答

4

我同意 @hek2mgl 的观点,将其视为多部分表单上传最为合理,但如果您无法更改输入接口,则可以在流上使用 file_put_contents() 而不是自己循环遍历文件。

$handle = fopen("php://input", "rb");  
if (false === file_put_contents("outputfile.dat", $handle))
{
  // handle error
}
fclose($handle);

它比遍历文件更加清晰,而且可能更快(我没有测试过)。

2
不要使用file_get_contents,因为它会尝试将文件的所有内容加载到一个字符串中。 FROM PHP DOC

file_get_contents()是将文件内容读入字符串的首选方法。如果您的操作系统支持内存映射技术,它将使用这些技术来提高性能。

我确定您只是想在服务器上创建电影文件.. 这是一种更有效的方式。
$in = fopen("php://input", "rb");
$out = fopen('largefile.dat', 'w');

while ( ! feof($in) ) {
    fwrite($out, fread($in, 8192));
}

0
如果您使用nginx作为Web服务器,我想推荐nginx上传模块,它具有恢复上传的功能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接