1

我们使用SugarCRM中的 Zend_PDF 模块来合并我们系统生成的 pdf 发票。我已经能够成功合并多个 PDF(在我的测试中大约 10 到 30 个),但是当我们尝试合并大量 pdf 文件时出现内存错误。错误看起来像这样:

[2012 年 1 月 30 日 14:10:20] PHP 致命错误:在 /usr/local/src/php-5.3.8/Zend/zend_operators.c:1265 处耗尽了 268435456 字节的允许内存大小(尝试分配 68134 字节) 在第 442 行的 /srv/www/htdocs/sugar6_mf/Zend/Pdf/Element/Object/Stream.php

当我们尝试合并 457 个 pdf 文件时产生上述错误 - 那是文件,而不是页面。我们最终需要一次合并5,000多个。

任何人都可以就如何解决这个问题提供任何帮助/建议吗?

如果需要,请询问,我将发布有关如何生成合并 pdf 的代码。

谢谢。

4

1 回答 1

2

在回答这个问题之前,我应该说我对 SugarCRM 一无所知——我的回答完全基于我对Zend_Pdf.

如果我的理解是正确的,您有一个 PHP 脚本(希望不会在 Apache 中运行,考虑到处理 5,000 个文件所需的时间长度),它使用该Zend_Pdf::load()方法将多个 PDF 文件作为输入,然后遍历每个 PDF 的页面对象并将它们添加到 的一个目标实例,然后您将使用该方法Zend_Pdf将其写入文件。save()

使用这种方法,即使在unset()将页面添加到目标 PDF 对象之后您的每个源 PDF 对象,您仍然需要足够的内存来存储整个输出文件。如果你只用 457 个文件就超过了 250MB,那么我猜你的输入 PDF 文件可能大约 500KB,所以你的输出文件绝对是巨大的,所以你最终还是会耗尽内存。

我的建议是完全放弃这种方法并改用pdftk它,您可以使用该exec()函数调用它。我确信您可以提供的参数的大小是有限制的exec(),因此它可能是一个包含多个中间文件的多步骤过程,但最终我认为这将是一个更快、更强大的解决方案。

只是为了重申之前的观点,我不会在 Apache 中运行这个过程。我会设置一个cron以适当的时间间隔运行的作业,并将输出文件放入您的网络/文件服务器上的安全区域。

于 2012-02-03T01:10:02.810 回答