hi,你好!欢迎访问本站!登录
本站由简数采集腾讯云宝塔系统阿里云强势驱动
当前位置:首页 - PHP问题 - 正文 请牢记本站网址www.sosophp.cn

php递归内存怎样开释【php题目】

2019-11-26PHP问题搜搜PHP网61°c
A+ A-

假如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网别的相干文章!

  选择打赏方式
微信赞助

打赏

QQ钱包

打赏

支付宝赞助

打赏

  选择分享方式
  移步手机端
php递归内存怎样开释【php题目】

1、打开你手机的二维码扫描APP
2、扫描左则的二维码
3、点击扫描获得的网址
4、可以在手机端阅读此文章
标签: