2012-04-16 34 views
2

我使用dompdf生成約700個PDF並將它們保存到磁盤。每一個涉及一個數據庫查詢來獲取PDF的信息。當我運行它時,我大概會花2分鐘時間,然後耗盡內存。在PHP中執行大型操作而不會耗盡內存?

  1. 爲什麼我內存不足?不應該每個PDF生成消耗x內存,然後在完成時釋放它?

  2. 在PHP這樣的大型操作中避免扼殺你的服務器有什麼好的做法?

一些更多的信息:

  • 它運行內存之前生成的PDF文件很多(有些100S)
  • 失敗上的PDF是不以任何方式異常大的或特殊。它們都在4KB到500KB之間
  • 看着內存使用情況,它在處理它時只是緩慢地爬上去,直到它用完爲止。

我不能讓所見即所得正確編碼格式,所以這裏是有問題的片段一pastie:http://pastie.org/3800751

+1

處理X個PDF文件之後,還是在處理完任何文件之後,內存是否用完? – 2012-04-16 21:42:38

+0

你可以創建相同的PDF 700次嗎?也許這只是一個太大的PDF達到最大值。內存限制從php.ini? – Smamatti 2012-04-16 21:44:17

+0

借調。我們需要遠遠超過這個來診斷問題。如果您只生成一個PDF會發生什麼?你可以發佈你的算法的僞代碼,或者甚至更好的問題的最小例子? – jimw 2012-04-16 21:44:24

回答

0

在一般情況下,像這樣大的行動應分叉成子進程,每個處理生成一個PDF。這應該避免出現內存不足的情況,以防您的PDF或DB庫泄漏內存。

1

您的問題可能是您異步運行您的代碼。嘗試同步運行它,可能需要很長時間,但它會起作用。另外,請確保在每個循環結束時處理您的對象。

0

嘗試php.ini

+1

雖然這可能起作用,但它不會診斷或解決問題。 – 2012-04-16 21:55:35

1

想法改變memory_limit

  • 增加內存限制ini_set
  • 使用cron作業,或一般儘量與隊列中運行的每一個PDF生成 異步。使用header每批 同一頁後
  • 批次(分割)加工成 可以在一個頁面負載內被處理的數/重定向/保持你在每個腳本負載session其中的軌道/上的重定向限制當心瀏覽器
+0

我的意圖是在cron作業上運行它。我如何使用單個cron執行批量運行它?我對你提到的重定向方法沒有任何問題,但我不確定這是否適用於cron類型的設置? – Joren 2012-04-16 23:39:16

+0

您可以在單個crontab命令中將多個執行鏈接在一起,以便它們按順序運行,我相信。 – Ing 2012-04-17 06:44:00