2013-10-31 131 views
0

更新我注意到,與一個特定的require_once('myobject.php')內存增加出現。這個require_once()有條件地運行。當我將if語句中的require_once()語句移出所以它一直加載時,內存增加就消失了。對我來說沒有意義,但問題解決了。我不確定這實際上是一個「答案」,所以我將不予答覆。這是一個php內存泄漏?

我在我頁面的頁腳有memory_get_usage(),每次刷新頁面時,我都會看到它每次增加大約100K。我的頁面加載創建了許多對象,並在完成後將其銷燬。我的每個父對象都有__destruct(),它使用unset()與所有子對象。具有引用的子對象返回給父對象,它們具有__destruct()unset()這些引用。

在處理我的頁面的不同部分之前和之後插入memory_get_usage()只會告訴我由於腳本的該部分而增加了多少總使用量。如何確定哪些內存丟失,並且在頁面加載完成後不回收垃圾回收?我有一個全局$ _SESSION var包含對象存儲用戶信息,但已經驗證使用strlen(序列化($對象)),該對象不增長的大小。

我認爲我所看到的是內存泄漏,並且腳本結束後,php垃圾回收應該有效。任何想法如何調試?

+0

有人可以糾正我,如果我錯了,但如果你有一個標準的Apache和PHP設置,PHP進程在請求完成後被銷燬,所以它不會在請求之間使用內存。所以'unset()'不重要(跨請求)。對於php-fpm,這可能會有所不同,我不確定。但可能沒有內存泄漏,但可能會增加一些會話文件的大小,因此下次加載時會更大。 – Matt

+0

@Matt爲什麼你沒有發佈這個答案,這將是一個很好的答案。 – Vallentin

+0

當然,我認爲我的答案可以詳細闡述,但我現在將其發佈爲起點。 – Matt

回答

2

有人可以糾正我,如果我錯了,但如果你有一個標準的Apache和PHP設置,PHP進程在請求完成後被銷燬,所以它不會在請求之間使用內存。

所以unset(),__destruct()等無所謂(跨越請求)。當PHP進程結束時,所有內存都將被回收。

但是很可能沒有內存泄漏,但可能會增加一些會話文件的大小,所以它在下次加載時會更大。

注意:這可能是不同的php-fpm,我不知道。

+0

感謝您的意見。我注意到一個特殊的'require_once('myobject.php')'顯示內存增加了。這個'require_once()'是有條件地運行的。當我將if_語句的'require_once()'語句移出來,所以它一直加載,內存增加就消失了。這有意義嗎? – mseifert

+0

我不知道病情是什麼。或者是每次發生內存增加,還是隻有當這個未知條件滿足時纔會更高。 N重新加載後內存是否增加無限(N至少爲10,20,100)? – Matt

+0

隨着每次重新加載,增加量爲80k到150k,我從未發現任何限制 - 儘管我只嘗試了30次。 – mseifert