Php 如何快速高效地将文件块(html5分块的结果)合并到一个文件中

Php 如何快速高效地将文件块(html5分块的结果)合并到一个文件中,php,html,file-upload,file-io,file-transfer,Php,Html,File Upload,File Io,File Transfer,我创建了一个文件传输程序,它使用html5分块上传大约4gb的文件。每个区块大小为100MB,我只是毫无理由地选择它,因为我尝试使用10MB,就我所知,它并没有任何区别 它可以正确上传每个区块。但在完成上传后,我尝试将文件合并回一个片段,但这需要很多时间。如果我尝试刷新上传程序的web ui,它在完成合并之前不会工作 我的合并代码如下所示: $final_file_path = fopen($target_path.$file_name, "ab"); //Reconstructed Fil

我创建了一个文件传输程序,它使用html5分块上传大约4gb的文件。每个区块大小为100MB,我只是毫无理由地选择它,因为我尝试使用10MB,就我所知,它并没有任何区别

它可以正确上传每个区块。但在完成上传后,我尝试将文件合并回一个片段,但这需要很多时间。如果我尝试刷新上传程序的web ui,它在完成合并之前不会工作

我的合并代码如下所示:

$final_file_path = fopen($target_path.$file_name, "ab");


//Reconstructed File
for ($i = 0; $i <= $file_total_chunk; $i++) {
    $file_chunk = $target_path.$file_name.$i;    

    if ( $final_file_path ) {
        // Read binary input stream and append it to temp file
        $in = fopen($file_chunk, "rb");
        if ( $in ) {
            //while ( $buff = fread( $in, 1048576 ) ) {
            while ( $buff = fread( $in, 104857600 ) ) {
                fwrite($final_file_path, $buff);
            }   
        }
        if(fclose($in)) {
            unlink($file_chunk);
        }        
    }
}

fclose($final_file_path);   
是否有任何方法可以快速有效地完成这项工作。我正在使用PHP


谢谢

您可能应该考虑将上传和连接过程分为两个单独的过程。上传和通知用户文件已经通过网页上传可以一起完成,后端处理可能应该在一个完全独立的过程中完成

我将考虑设置一个作业队列来处理连接过程,其中PHP上载脚本一旦完成,就会将一个作业放入队列中,服务器上运行的守护进程会生成一个工作进程来执行连接

就个人而言,我会让工作人员使用cat进行连接

如果您仍然希望在PHP中执行此操作,则可以执行以下操作:

for ($1 = 0; $i <= $file_total_chunk; $i++) {
    $files[] = $target_path.$file_name.$i;
}

$catCmd = "cat " . implode(" ", $files) . " > " . $final_file_path;
exec($catCmd);

确保已清理文件名,否则可能会在此处的命令行上插入任意代码。

您可能应该考虑将上载和连接过程拆分为两个单独的过程。上传和通知用户文件已经通过网页上传可以一起完成,后端处理可能应该在一个完全独立的过程中完成

我将考虑设置一个作业队列来处理连接过程,其中PHP上载脚本一旦完成,就会将一个作业放入队列中,服务器上运行的守护进程会生成一个工作进程来执行连接

就个人而言,我会让工作人员使用cat进行连接

如果您仍然希望在PHP中执行此操作,则可以执行以下操作:

for ($1 = 0; $i <= $file_total_chunk; $i++) {
    $files[] = $target_path.$file_name.$i;
}

$catCmd = "cat " . implode(" ", $files) . " > " . $final_file_path;
exec($catCmd);

确保已清理文件名,否则可能会在此处的命令行上插入任意代码。

如果在使用带有exec函数的php时不想等待,可以使用with with ASCHNORY response from workers。在worker内部,您可以使用@hafichuk解决方案。队列使您的整个应用程序更具可伸缩性。

如果在使用带有exec函数的php时不想等待,您可以使用with with ASCHONAL response from workers。在worker内部,您可以使用@hafichuk解决方案。队列使您的整个应用程序更具可伸缩性。

PHP对于这个IMO来说是错误的技术。我将从命令行中使用cat并设置作业队列来处理processI second hafichuk的响应。如果PHP不打算对数据进行任何处理,那么就没有理由让它读取数据。在Windows上使用cat或type之类的工具并将所有文件附加到一个结果文件中。对于这个IMO,PHP是错误的技术。我将从命令行中使用cat并设置作业队列来处理processI second hafichuk的响应。如果PHP不打算对数据进行任何处理,那么就没有理由让它读取数据。在Windows上使用类似于cat或type的东西并将所有文件附加到一个结果文件中$chunk_name>$upload_file_name'@kirugan谢谢,我在答案中添加了一个PHP示例。我确实考虑过这个问题,但是如果是这样的话,我怎么知道文件合并完成了,这样我就可以将下载链接发送给收件人?另外,在合并过程中,需要大量cpu使用42个100MB的文件,变成4个文件中的一个,这是否正常。2GB@hafichuk所以,如果我使用php,exec$catCmd;在执行该命令之后,脚本将一直运行,直到完成为止,这使得更改页面的速度非常慢,我想这是不可能的。我在这里该怎么办?关于工人,你有使用工人的例子吗?感谢您的PHP脚本,您应该从exec获得一个返回值,它将告诉您作业是否成功。至于脚本超时,您需要调整php,这是在php中不这样做的另一个原因$chunk_name>$upload_file_name'@kirugan谢谢,我在答案中添加了一个PHP示例。我确实考虑过这个问题,但是如果是这样的话,我怎么知道文件合并完成了,这样我就可以将下载链接发送给收件人?另外,在合并过程中,需要大量cpu使用42个100MB的文件,变成4个文件中的一个,这是否正常。2GB@hafichuk所以,如果我使用php,exec$catCmd;在执行该命令之后,脚本将一直运行,直到完成为止,这使得更改页面的速度非常慢,我想这是不可能的。我在这里该怎么办?关于工人,你有例子吗
e使用工人?感谢您的PHP脚本,您应该从exec获得一个返回值,它将告诉您作业是否成功。至于脚本超时,您需要调整php,这是不在php中执行此操作的另一个原因。我完全支持将其拆分为异步步骤。我还注意到你最近忙得不可开交,并找到了一些其他的问答题来回答你的问题。我完全支持将其拆分为异步步骤。我还注意到你最近忙得不可开交,还找到了一些其他的问答题。