2013-05-22 77 views
0

我已經使用SendGrid官方PHP庫和SMTP API(自動郵件程序作爲Ubuntu服務器上的cron作業運行)構建了一個自動郵件應用程序。體面內存分析工具,用於php

在生產服務器上的內存限制設置爲32M,然而在生產服務器上的應用程序第一次運行的一個我得到的消息

用盡33554432個字節

允許的內存大小,赤身試圖分配256478字節

這是毫無意義的,因爲256478 < 33554432,但我懷疑我有內存泄漏的地方。

根據to this post,PHP有內存泄漏問題,在處理對象之間的相互關係時,我使用我自己的Wrapper類來使代碼更易於讀取和構造,一個主要的mailService類以及每個任務的一個類,它實現一個接口,併爲每個電子郵件返回所有特定數據(標題,子值,收件人列表)。

我會先爲我的界面和每個類添加一個析構函數,以確保沒有內存泄漏,但我不確定這是否能解決問題,因爲根據內存基準測試我執行了大部分的執行時間,並且內存被SwiftMailer的MailTransport.php類所使用。

所以我的問題我基本上,我怎麼能重置每次每次迭代這一類的內存使用情況?有沒有內置的東西,或者我應該實現方法,這樣對我自己?

任何援助非常感謝。

小的可視化:enter image description here

+1

您是否建立了所有電子郵件收件人的列表?該coupld很容易成爲內存管理員,尤其是32M的低限制 –

+0

那麼,每個特定的任務僅限於某些用戶,NotifyTokenExpiry僅適用於過去一個月內其令牌過期的用戶,TopScores僅用於主動排名用戶等等,並且在每次迭代結束時,我將unset()保存收件人列表的成員,並在之後爲它確定一個空值。 無論如何,你必須有一個體面的電子郵件超過32M的限制,我只測試了我的應用程序與低於500電子郵件地址 –

回答

5
用盡33554432個字節

允許的內存大小,一夥試圖分配256478個字節

意味着PHP正試圖分配一個額外 256478超出什麼它已經在腳本運行期間分配了,並且附加的請求是將所使用的總內存超過了33554432的閾值。

PHP的早期版本有內存問題時,他們遇到的對象之間的循環引用,雖然這與5.4提高....你是否會受到影響將取決於你正在運行的PHP版本,和你的類是否真的含有這樣的循環引用

+0

我運行PHP 5.4,我如何跟蹤和修復可能的內存泄漏? 對於我來說,當所有的事情都在發送電子郵件時,應用程序消耗大量的內存似乎是不可能的。 謝謝你的回覆! –

+1

正如我前面提到的,如果你正在爲你的電子郵件建立一個收件人列表,那可能會消耗內存 - 但是32MB是PHP加上它的所有模塊加上你的腳本 –

+0

我做了數學,我的電子郵件模板權重爲8 KB,並且每個電子郵件類型加載一次,電子郵件收件人列表由一個常規密鑰=> val數組組成,並且其中有<500個條目,然後有替代值,它們可以加權爲幾MB最多500個收件人列表,但沒有更多。 所以除非php使用25MB的32MB分配,否則沒有意義:( –