【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代码中已经被修复了。