PHP5 物件相互引用, 造成 Memory Leak

PHP5 的 物件A 裡面再 new 物件B, 然後 unset(物件A), 會發現 Memory 還是存在(Memory Leak) 的狀況, 然後如果程式繼續不斷的遞迴跑下去, 很快記憶體就會使用完, 然後就會出現 PHP Fatal error:  Allowed memory size of .. 等的錯誤訊息.

可詳見: Bug #33595 recursive references leak memory

會找到此 Bug 主要是看到這篇文章: PHP5研究室 - PHP对象相互引用的内存溢出

只要是物件相互引用就有可能造成此問題, 詳細的說明可見上述文章, 所以這邊就引用此 問題的發生情況 和 解法.(可見 PHP5研究室的文章, 或 Bug 的連結裡面都有寫詳細說明和程式解法)

問題發生狀況

  • Object A 裡面 new Object B, 然後 unset(Object A), 會造成 Memory Leak.

解法

  1. Object A 要寫 __destruct(), 在 __destruct() unset(Object B).
  2. 在 unset(Object A) 前, 記得要先跑 Object A->__destruct(), 再 unset(Object A).

範例

裡面範例直接跑就會看到 Memory Leak 的狀況, 解法就是把註解區塊拿掉(8~13行, 25行), Memory 使用狀況不會一直累加. 🙂


關於 Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.
本篇發表於 News_Security, Programming。將永久鏈結加入書籤。

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料