2015-04-30 59 views
2

我收到此錯誤信息:PHP內存限制 - OutOfMemoryException異常

Error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 13343871 bytes)

我並不感到驚訝,因爲它是一個腳本這是產生的數千條記錄的報告(數以千計的SQL查詢獲得 - 由於它的本性,它不會是一個有效的腳本)。這是一個緩慢的腳本,這是可以的 - 我已經在頁面上發出警告,通知用戶這一點。

我只是不想讓這個錯誤發生。

生成的CSV文件在我看來是完整的(就數據而言),但在CSV文件的底部,我收到了堆棧跟蹤和OutOfMemoryException異常,如上面的消息中所示。

因爲我已經覆蓋了PHP默認腳本的這一特定部分:

ini_set('memory_limit', '512M'); 
ini_set('max_execution_time', 300); 

還有什麼我可以做什麼?

+2

我想嘗試流csv。經常沖洗輸出緩衝區。爲什麼在發送之前將整個內容留在內存中? – keyboardSmasher

+0

如果您不在乎分配更多內存 –

回答

0

從您的問題中可以清楚地看到,您已將512 MB內存分配給PHP,但當您遇到異常時,您的腳本需要的不僅僅是這些。如果您的PC上具有更多RAM功能,只需將此RAM分配增加到更高的值即可。

但是,將所有內容保存在內存中並不是一個好主意。您應該將它以塊形式寫入磁盤&釋放已使用的內存以最大限度地降低使用率。

+0

我使用的虛擬服務器內存最大爲512MB RAM,而另一個虛擬內存爲512MB。如果我將內存限制增加到1GB,PHP腳本是否也會使用虛擬內存啓動?或者,PHP內存限制是否僅指物理內存? – b85411

+0

@ b85411它可能已經在使用一些虛擬內存(或交換)了 - 操作系統也需要一些磁盤空間。 Swap實際上很慢,所以通常優化算法/代碼以使用更少的內存。 – starbeamrainbowlabs

0

我肯定會建議增加機器的內存。耗盡內存真的不是一個好主意,並且會根據具體情況停止腳本執行,如果不是的話。

就抑制錯誤而言 - IE。堆棧軌跡 - 您收到,請務必先關閉誤差

ini_set('display_startup_errors', 0); 
ini_set('display_errors', 0); 
error_reporting(0); 

此報告將只工作,如果內存耗盡沒有完全停止執行,雖然。