我们正在使用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的代码。
感谢。
答案 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 /文件服务器上的安全区域。