
假如PHP对象存在递归援用,就会涌现内存走漏。这个Bug在PHP里已存在很久很久了,先让我们来重现这个Bug,代码以下:
<?php class Foo { function __construct() { $this->bar = new Bar($this); } } class Bar { function __construct($foo) { $this->foo = $foo; } } for ($i = 0; $i < 100; $i++) { $obj = new Foo(); unset($obj); echo memory_get_usage(), " "; } ?>
运转以上代码,你会发明,内存使用量本应当稳定才对,可实际上倒是不停增添,unset没有完整见效。
如今的开辟许多都是基于框架举行的,运用里存在庞杂的对象关联,那末就很可能会碰到如许的题目,下面看看有什么权宜之计:
<?php class Foo { function __construct() { $this->bar = new Bar($this); } function __destruct() { unset($this->bar); } } class Bar { function __construct($foo) { $this->foo = $foo; } } for ($i = 0; $i < 100; $i++) { $obj = new Foo(); $obj->__destruct(); unset($obj); echo memory_get_usage(), " "; } ?>
荣幸的是这个Bug在PHP5.3的CVS代码中已被修复了。
递归停止前提,平常有多种体式格局:
1. 增加递归深度参数到递归函数的参数中
每次挪用深度加一,在函数体中增加前提语句,当深度凌驾某个值时强行return;
2. 引入元素栈构造,每次递归的一些须要纪录的内容,通常会压入栈中,恰当的时刻再弹出
在函数体中,增加前提语句,推断栈大小或许栈元素,到达前提时举行return;
以上就是php递归内存怎样开释的细致内容,更多请关注ki4网别的相干文章!