2012-02-02 201 views
1

我們正在使用SugarCRM中的Zend_PDF模塊合併我們的系統生成的pdf發票。我已經能夠成功地合併大量的PDF(在我的測試中大約10到30),但是當我們嘗試合併大量的pdf文件時,我們正在收到內存錯誤。錯誤看起來是這樣的:當我們試圖合併457個PDF文件生成使用Zend_PDF合併大量PDF時出現內存不足錯誤

[30-Jan-2012 14:10:20] PHP Fatal error: Allowed memory size of 268435456 bytes exhausted at /usr/local/src/php-5.3.8/Zend/zend_operators.c:1265 (tried to allocate 68134 bytes) in /srv/www/htdocs/sugar6_mf/Zend/Pdf/Element/Object/Stream.php on line 442

上述錯誤 - 這是文件,而不是網頁。我們需要最終一次合併5,000以上。

任何人都可以提供任何幫助/建議如何解決這個問題?

如果需要,請問,我將發佈關於如何生成合並pdf的代碼。

謝謝。

回答

2

我應該在這個答案前面說我對SugarCRM一無所知 - 我的回答完全基於我對Zend_Pdf的瞭解。

如果我的理解是正確的,你有一個PHP腳本(希望在Apache運行考慮的時間長短,將採取處理5000個文件)是使用Zend_Pdf::load()方法,然後以多個PDF文件作爲輸入遍歷每個PDF對象的頁面並將它們添加到一個目標實例Zend_Pdf,然後使用save()方法將其寫入文件。

使用這種方法,即使您在將頁面添加到目標PDF對象之後,每個源PDF對象都是unset(),您仍然需要足夠的內存來存儲整個輸出文件。如果你只用457個文件就可以破解250MB,那麼我猜你的輸入PDF文件大概是500KB,所以你的輸出文件將會非常龐大​​,所以你仍然會用盡內存。

我的建議是將此方法完全拋棄並使用pdftk代替,您可以使用exec()函數調用該方法。我確信可以提供給exec()的參數大小有限制,所以它可能是一個包含多箇中間文件的多步驟過程,但最終我認爲這將是一個更快,更強大的解決方案。

而只是重新迭代一個更早的點,我會而不是在Apache中運行此過程。我會設置一個以適當間隔運行的cron作業,並將輸出文件放到Web /文件服務器上的安全區域。

+0

謝謝,詹姆斯。我們來看看pdftk。儘管我們希望/需要生成儘可能多的pdf,但我們甚至可能不得不求助於將合併分解成某種邏輯塊(即按照客戶或某物的字母順序)。 – marky 2012-02-03 17:36:51

+0

沒問題 - 很樂意幫忙。祝你的項目好運! :-) – JamesG 2012-02-06 01:04:22

+0

**更新/測試報告:**使用pdftk我可以將大小從88到350KB的1200個pdf合併成一個單頁,多頁pdf,重量爲3.5MB,時間不到5秒 - **在**腳本中! **謝謝!** – marky 2012-02-07 13:04:05