2014-11-24 151 views
0

我正在使用ZipArchive的extractTo方法解压缩一些非常大的文件(有些超过10G)的脚本。一切工作正常的小文件,但我一直在测试它与〜4G的文件,并注意到解压缩工作到一个点,然后它停止实际解压缩。但是,PHP脚本似乎正在运行。没有错误或异常被抛出。从终端我坐在文件夹中,并继续输入ls -la来观察提取文件的大小增长。它会这样做一段时间,然后停止并继续加载脚本(通过浏览器和顶部观看)。然后脚本会运行指定的超时时间(我设置为3600)并抛出超时错误。该机器运行的是Centos 6.6,16G内存,大量的处理能力和大量的磁盘空间。似乎解压缩为5011800064字节。这里是我的代码的一些选择位:PHP ZipArchive extractTo()与大文件挂起

set_time_limit(1200); 
ini_set('memory_limit', '1024M'); 

$zip = new ZipArchive; 

    $res = $zip->open($zipPath); 

    if ($res === TRUE) 
    { 
     $extres = $zip->extractTo(
      $unzipPath, 
      $filesToExtract 
     ); 

     $zip->close(); 
    } 

任何帮助将不胜感激。我也很想知道extractTo()函数是否尝试将整个zip加载到内存中?我浏览了PHP文档,找不到任何相关的内容。所有相关的职位要么没有答案,并且在解释问题时并不具体。

编辑:只是为了确认,我有超过20G的空闲空间,并为脚本设置不同的内存限制,不会改变解压缩的字节数。

更新:我检查了httpd.conf,php.ini,并且找不到禁止解压缩操作的任何设置。

+0

实际上,您正在将自己的服务器砰地停下来,它会将整个zip加载到内存中。这不关我的事,但为什么你通常需要提取10g +到你的服务器。另外..试试gzip – zanderwar 2014-11-30 03:49:33

+0

啊,这解释了为什么它如此迅速地落后。还有一个很好的问题,它是数据提取程序的一部分。我使用PHP的原因是易于与Web界面集成,并具有良好的DOM功能。 – user2395126 2014-11-30 04:00:41

回答

2

传统.zip存档是limited in size to 4GB

两个存档文件和它里面的各个文件的最大尺寸为标准4,294,967,295字节(232-1个字节或4吉布减去1个字节) .ZIP和18,446,744,073,709,551,615字节(264-1字节或16 EiB减1字节)。

要使用PHP中的ZIP64解压缩较大的档案,您需要使用PHP 5.6,它使用libzip 0.11.2

+0

谢谢你的解决方案。我的测试服务器运行的是旧版本的PHP(5.3.3),现在正在升级! – user2395126 2014-11-30 04:10:32

+0

好的答案,+1 – zanderwar 2014-11-30 04:18:09

+0

我非常高兴地确认PHP 5.6处理大型压缩文件没有问题! – user2395126 2014-11-30 21:47:42