使用Zend_PDF合并大量PDF时出现内存不足错误

时间:2012-02-02 15:42:55

标签: pdf merge sugarcrm zend-pdf

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

  

[30-Jan-2012 14:10:20] PHP致命错误:/usr/local/src/php-5.3.8/Zend/zend_operators.c:1265允许的内存大小为268435456字节(试图在第442行的/srv/www/htdocs/sugar6_mf/Zend/Pdf/Element/Object/Stream.php中分配68134个字节

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

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

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

感谢。

1 个答案:

答案 0 :(得分:2)

我应该在这个答案前面说我对SugarCRM一无所知 - 我的回答完全基于我对Zend_Pdf的了解。

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

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

我的建议是完全抛弃此方法并改为使用pdftk,您可以使用exec()函数调用它。我确定你可以提供给exec()的参数的大小是有限的,所以它可能是一个包含多个中间文件的多步骤过程,但最终我认为这将更快,更健壮溶液

为了重新迭代前一点,我会在Apache中运行此过程。我会设置一个以适当的间隔运行的cron作业,并将输出文件放到Web /文件服务器上的安全区域。