PHP ZipArchive extractTo()与大文件一起停顿

时间:2014-11-24 18:44:43

标签: php ziparchive

我正在编写一个脚本,它使用ZipArchive的extractTo方法解压缩一些非常大的文件(有些超过10G)。一切都适用于小文件,但我一直在测试它~~ 4G的文件并注意到解压缩工作到一定程度,然后它停止实际解压缩。但是,PHP脚本似乎正在运行。不会抛出任何错误或异常。从终端我坐在文件夹中并继续输入ls -la来观察提取文件的大小增长。它会这样做一段时间,然后停止并继续加载脚本(通过浏览器和顶部观看)。然后,脚本将运行指定的超时时间(我设置为3600)并抛出超时错误。该盒子运行Centos 6.6,16G的RAM,充足的处理能力和充足的磁盘空间。似乎是在解压缩5011800064字节时崩溃。以下是我的代码中的一些选择位:

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,并且找不到任何禁止解压缩操作的设置。

1 个答案:

答案 0 :(得分:2)

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

  

对于标准.ZIP,存档文件及其中的单个文件的最大大小为4,294,967,295字节(232-1字节,或4 GiB减1字节),以及18,446,744,073,709,551,615字节(264-1字节或16 EiB) ZIP64。减去1个字节。

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