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.
解法
- Object A 要寫 __destruct(), 在 __destruct() unset(Object B).
- 在 unset(Object A) 前, 記得要先跑 Object A->__destruct(), 再 unset(Object A).
範例
裡面範例直接跑就會看到 Memory Leak 的狀況, 解法就是把註解區塊拿掉(8~13行, 25行), Memory 使用狀況不會一直累加. 🙂