【PHP内存泄漏案例】PHP对象递归引用造成内存泄漏

【PHP内存泄漏案例】PHP对象递归引用造成内存泄漏

如果PHP对象存在递归引用,就会出现内存泄漏。这个Bug在PHP里已经存在很久很久了,先让我们来重现这个Bug,代码如下:

01 <?php

02 class Foo {

03 function __construct() {

04 $this->bar = new Bar($this);

05 }

06 }

07

08 class Bar {

09 function __construct($foo) {

10 $this->foo = $foo;

11 }

12 }

13

14 for ($i = 0; $i < 100; $i++) {

15 $obj = new Foo();

16

17 unset($obj);

18

19 echo memory_get_usage(), "

20 ";

21 }

22 ?>

运行以上代码,你会发现,内存使用量本应该不变才对,可实际上却是不断增加,unset没有完全生效。

现在的开发很多都是基于框架进行的,应用里存在复杂的对象关系,那么就很可能会遇到这样的问题,下面看看有什么权宜之计:

01 <?php

02 class Foo {

03 function __construct() {

04 $this->bar = new Bar($this);

05 }

06

07 function __destruct() {

08 unset($this->bar);

09 }

10 }

11

12 class Bar {

13 function __construct($foo) {

14 $this->foo = $foo;

15 }

16 }

17

18 for ($i = 0; $i < 100; $i++) {

19 $obj = new Foo();

20

21 $obj->__destruct();

22

23 unset($obj);

24

25 echo memory_get_usage(), "

26 ";

27 }

28 ?>

办法有些丑陋,不过总算是对付过去了。幸运的是这个Bug在PHP5.3的CVS代码中已经被修复了。