php解压大文件

Posted

技术标签:

【中文标题】php解压大文件【英文标题】:php unzipping huge files 【发布时间】:2012-05-20 03:11:10 【问题描述】:

我正在尝试使用 php zip 存档解压缩一个巨大的文件(400+M 压缩超过 4G 解压缩)。我只解压缩压缩文件中的一个 csv 文件。我感兴趣的文件解压缩后超过 4G。我从文件末尾获得了 3 条记录,并且该过程开始进入 lala 土地。 .我的意思是这个过程只是继续......没有输出..没有错误没有循环它只是继续......我不知道它在做什么......我的代码很简单:

$zip = new ZipArchive;
$res = $zip->open($file);
if ($res === TRUE) 

   $num = $zip->numFiles;
   for($i = 0; $i < $zip->numFiles; $i++) 
   
      $filename = $zip->getNameIndex($i);
  // if its the file I want then...
      $content = '';
  // my output file  .. yes I've already checked to make sure the dir exists
      $unzipped = fopen($dir ."/2" . $filename  , 'wb');         
      $fp = $zip->getStream($filename);
      if(!$fp) exit("failed\n");
      while (!feof($fp))
      
    $chunkSize = 10240;
    $contents = fread($fp, $chunkSize);
        $fwrite = fwrite($unzipped, $contents);
      
      fclose($fp);
      fclose($unzipped);
    

    $zip->close();
    fclose($filename);

  

我删除了写入另一个文件以跟踪进度的语句。我把大部分文件都拿出来了..(正如我所说,整个文件少了 3 条记录)......但是这个过程似乎在某个地方发生了......它发生在 fread 上,我只是无法弄清楚发生了什么..它还没有达到eof..源是完整的(在fread之前用is_source($fp)检查..它没有抛出任何错误..关闭浏览器并不能阻止它..甚至不能停止apache .. 必须关闭才能结束它...

有什么想法吗??

谢谢

【问题讨论】:

【参考方案1】:

老实说听起来像是一个错误(在 php 中)。

您可能想尝试将调用输出到memory_get_usage() 以帮助您进行调试。但是,也请参阅stream_copy_to_stream(),因为您可以摆脱所有循环的麻烦。保持写入的总字节数以查看出错的数字是否可疑也可能很有趣。

【讨论】:

根据文档页面上的某个人的说法,该函数本身似乎使用了相当多的内存。因此,如果这是真的并且内存是这里的问题,那么这可能不是解决方案。 嗨,克里斯,尝试了有趣的结果,它没有复制整个文件,但也没有进入 lala 土地,这让我相信第一个问题可能成为最初的 zip 流.. 它可能无法获取所有内容.. 但这是一个不同的问题,我需要在发布之前进行一些研究.. 再次感谢。【参考方案2】:

这是在黑暗中的尝试,但请尝试增加脚本可以分配的内存量。我在使用 gzip 函数时遇到了类似的问题,我不得不进行此更改。

ini_set('memory_limit', '512M');

【讨论】:

嗨尼克,谢谢你的建议,试过了,但没有什么不同。但还是谢谢【参考方案3】:
$filename = '/media/file.gz';

$unzipped_content = '';   
$zd = gzopen($filename, "r");
while ($zip_file = gzread($zd, 10000000))
    $unzipped_content.= $zip_file;

gzclose($zd);

echo $unzipped_content;

【讨论】:

以上是关于php解压大文件的主要内容,如果未能解决你的问题,请参考以下文章

javazip解压过大失败

解决MOFH免费空间cpanel面板大文件无法解压的情况

在不解压的情况下 怎么将分割的压缩文件合并成一个大的压缩文件

javazip压缩包过大解压失败

怎么样解决在linux系统下解压大文件zip时出错的办法

Python 3.8 lzma解压大文件增量输入输出