php解压大型文件

php解压大型文件,php,file,unzip,Php,File,Unzip,我正在尝试使用PHPZIP归档文件解压一个巨大的文件(400+m压缩,超过4G解压)。我只解压缩压缩文件中的一个csv文件。。我感兴趣的文件解压缩后超过4G。。我从文件的末尾得到了3条记录,这个过程就开始了。。我的意思是这个过程只是在继续。。没有输出。。没有错误没有循环它只是继续。。。我一点儿也不知道它在干什么。。我的代码很简单: $zip = new ZipArchive; $res = $zip->open($file); if ($res === TRUE) { $num =

我正在尝试使用PHPZIP归档文件解压一个巨大的文件(400+m压缩,超过4G解压)。我只解压缩压缩文件中的一个csv文件。。我感兴趣的文件解压缩后超过4G。。我从文件的末尾得到了3条记录,这个过程就开始了。。我的意思是这个过程只是在继续。。没有输出。。没有错误没有循环它只是继续。。。我一点儿也不知道它在干什么。。我的代码很简单:

$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);

}  
$zip=新的ZipArchive;
$res=$zip->open($file);
如果($res==TRUE)
{
$num=$zip->numFiles;
对于($i=0;$i<$zip->numFiles;$i++)
{
$filename=$zip->getNameIndex($i);
//如果这是我想要的文件,那么。。。
$content='';
//我的输出文件..是的,我已经检查了目录是否存在
$unzip=fopen($dir./2“$filename,'wb”);
$fp=$zip->getStream($filename);
如果(!$fp)退出(“失败”\n);
而(!feof($fp))
{
$chunkSize=10240;
$contents=fread($fp,$chunkSize);
$fwrite=fwrite($unzip,$contents);
}
fclose($fp);
fclose($unzip);
}
$zip->close();
fclose($filename);
}  
我已经删除了转到另一个文件以跟踪进度的write语句。我把大部分文件都拿出来了。。(正如我所说,整个文件缺少3条记录)。。。但这个过程似乎在某处发生了。。这件事发生在fread上我就是不知道发生了什么。。它还没有到达eof。。源代码完好无损(在fread之前用is_source($fp)检查)。它不会抛出错误。关闭浏览器不会停止它。甚至不能停止apache。必须关闭才能结束它

有什么想法吗


“谢谢”

老实说,听起来像个bug(在php中)


您可能希望尝试输出对()的调用以帮助调试因为你可以摆脱所有的循环积垢。保持写入的字节总数的运行可能也是一种尝试,以查看出错的数字是否可疑。

这是一种暗箭伤人的做法,但尝试增加脚本可以分配的内存量。我在使用gzip函数时遇到过类似的问题,我不得不这样做做这个改变

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

据文档页面上的某个人说,该函数本身似乎使用了相当多的内存。因此,如果这是真的,并且内存是这里的问题,那么这可能不是解决方案。嗨,Chris,尝试了一下,结果很有趣,它没有复制整个文件,但它也没有进入lala land,这让我相信这一点第一个问题可能是初始的zip流。它可能无法获得所有信息。但这是另一个问题,我需要在发布之前进行一些研究。再次感谢。嗨,尼克,谢谢你的建议,尝试过了,但没有效果。但无论如何,谢谢
$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;