最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

php递归内存怎么释放

来源:动视网 责编:小采 时间:2020-11-27 14:19:45
文档

php递归内存怎么释放

php递归内存怎么释放:如果PHP对象存在递归引用,就会出现内存泄漏。这个Bug在PHP里已经存在很久很久了,先让我们来重现这个Bug,代码如下:<php class Foo { function __construct() { $this->bar = new Bar($this); } } class Bar {
推荐度:
导读php递归内存怎么释放:如果PHP对象存在递归引用,就会出现内存泄漏。这个Bug在PHP里已经存在很久很久了,先让我们来重现这个Bug,代码如下:<php class Foo { function __construct() { $this->bar = new Bar($this); } } class Bar {


如果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递归内存怎么释放

php递归内存怎么释放:如果PHP对象存在递归引用,就会出现内存泄漏。这个Bug在PHP里已经存在很久很久了,先让我们来重现这个Bug,代码如下:<php class Foo { function __construct() { $this->bar = new Bar($this); } } class Bar {
推荐度:
标签: 内存 php 递归
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top