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

使用Zend_PDF合并大量PDF时出现内存不足错误,pdf,merge,sugarcrm,zend-pdf,Pdf,Merge,Sugarcrm,Zend Pdf,我们在中使用Zend_PDF模块合并系统生成的PDF发票。我已经成功地合并了许多pdf文件(在我的测试中大约是10到30个),但是当我们试图合并更多的pdf文件时,会出现内存错误。错误如下所示: [30-Jan-2012 14:10:20]PHP致命错误:第442行/srv/www/htdocs/sugar6_mf/Zend/Pdf/Element/Object/Stream.PHP中的/usr/local/src/PHP-5.3.8/Zend/Zend_operators.c:1265(试图分

我们在中使用Zend_PDF模块合并系统生成的PDF发票。我已经成功地合并了许多pdf文件(在我的测试中大约是10到30个),但是当我们试图合并更多的pdf文件时,会出现内存错误。错误如下所示:

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

上面的错误是在我们试图合并457个pdf文件时产生的——这是文件,不是页面。我们最终需要一次合并5000个或更多

有人能就如何解决这一问题提供帮助/建议吗

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


谢谢。

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

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

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

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


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

谢谢,James。我们来看看pdftk。有了我们想要/需要生成的尽可能多的PDF,我们甚至可能不得不将合并分解成某种逻辑块(即按客户字母顺序或其他方式)。没有问题-很乐意提供帮助。祝你的项目好运!:-)更新/测试报告:使用pdftk,我能够在不到5秒钟的时间内将大小从88到350KB的1200个pdf合并成一个3.5MB的单页多页pdf—在PHP脚本中!谢谢