1

我们有一个 php(版本 5.3.10)cli 应用程序在 ubuntu 12.04 64 位机器上做一些繁重的工作。该脚本可以运行很长时间,具体取决于它接收到的数据集。这些数据集是包含大量 XML、图像和 MS doc 文件的 zip 文件。

早些时候,这个脚本使用很少的系统命令(shell、perl、java)来完成它的任务。那时我们没有问题。最近,我们将这些脚本升级为使用 RabbitMQ 进行多个并发调用,从基于 cron 的工作转移到 supervisord 以进行自动恢复和监控,并尽可能使用 php 的核心库和函数来避免 shell 调用。

现在,在部署到生产环境后,我们发现脚本在使用 ZipArchive 创建档案的线路上致命地崩溃了。具体来说,仅在其方法“open”和“addFile”上。我们用有问题的数据集对此进行了多次测试,发现这是真正的问题所在。

抛出的错误是“致命错误:超过 300 秒的最大执行时间”。我们知道 php 对执行时间的限制,我们仔细检查了 php.ini 和“/etc/php5/conf.d”文件夹下的所有设置,并且在任何地方我们都将“max_execution_time”设置为 0。我们还检查了脚本的 sapi模式是使用“php_sapi_name()”的“cli”。ini_get("max_execution_time") 也返回 0。

即使脚本由supervisord管理,上述模式和执行限制也是一样的。我们无法找到这个 300 秒的“max_execution_time”限制是从哪里触发的。

还有一件事,当脚本因这条消息而崩溃时,它实际上运行了 600 多秒。我们也觉得,只有当 ZipArchive 本身耗时超过 300 秒时,才会发生这种情况。但我们不确定。发生这种情况时它创建的部分 zip 存档也在 280 MB 和 290 MB 之间。因此,我们从其存储库下载了 php 源代码,并进行了快速 grep 以查看 ZipArchive 的代码库是否有任何此类限制。我们没有找到。

我们现在正尝试用 shell 命令替换 ZipArchive php 代码作为解决方法。我们还没有测试它。我很快就会在这里发布我们的发现。

你们中有人遇到过这样的问题吗?这与 ZipArchive 有关吗?是否建议使用 ZipArchive 创建大型档案?它在崩溃之前创建的部分 zip 文件在 280 MB 和 290 MB 之间。

4

1 回答 1

0

使用 zipArchive 文件 > 500 MB 时,我遇到过同样的问题。在某些情况下,当文件大小相当小但文件数量较多时,它也会起作用。最后,我最终在 linux zip/unzip 命令上创建了一个包装器并使用它们,以便在核心中它基本上只是在操作系统级别上执行 exec()。从来没有遇到过问题。当然,您需要一个 sysad 来设置权限和所有内容,但它是一个稳定的解决方案。

于 2013-04-17T18:51:42.537 回答