PHP对象递归引用造成内存泄漏分析


Posted in PHP onAugust 28, 2014

通常来说,如果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(), "/n";
}
?>

运行以上代码,你会发现,内存使用量本应该不变才对,可实际上却是不断增加,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(), "/n";
}
?>

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

对此,在进行PHP程序设计时有必要加以注意!相信本文所述对大家的PHP程序设计有一定的参考价值。

PHP 相关文章推荐
也谈php网站在线人数统计
Apr 09 PHP
PHP实现阳历到农历转换的类实例
Mar 07 PHP
PHP 中提示undefined index如何解决(多种方法)
Mar 16 PHP
thinkphp多表查询两表有重复相同字段的完美解决方法
Sep 22 PHP
使用php完成常见的文件上传功能(推荐)
Jan 13 PHP
Yii框架创建cronjob定时任务的方法分析
May 23 PHP
PHP实现批量清空删除指定文件夹所有内容的方法
May 30 PHP
详解php中的implements 使用
Jun 13 PHP
PHP获取MySQL执行sql语句的查询时间方法
Aug 21 PHP
php基于协程实现异步的方法分析
Jul 17 PHP
PHP之多条件混合筛选功能的实现方法
Oct 09 PHP
php框架CI(codeigniter)自动加载与自主创建对象操作实例分析
Jun 06 PHP
PHP中cookie和session的区别实例分析
Aug 28 #PHP
PHP实现视频文件上传完整实例
Aug 28 #PHP
PHP获取表单所有复选框的值的方法
Aug 28 #PHP
PHP中echo和print的区别
Aug 28 #PHP
什么情况下可以不写PHP的闭合标签“?&gt;”
Aug 28 #PHP
PHP防盗链代码实例
Aug 27 #PHP
如何让搜索引擎抓取AJAX内容解决方案
Aug 25 #PHP
You might like
php at(@)符号的用法简介
2009/07/11 PHP
推荐几个开源的微信开发项目
2014/12/28 PHP
PHP转盘抽奖接口实例
2015/02/09 PHP
php获得文件大小和文件创建时间的方法
2015/03/13 PHP
Jquery AJAX 用于计算点击率(统计)
2010/06/30 Javascript
jquery实现的可隐藏重现的靠边悬浮层实例代码
2013/05/27 Javascript
一款基于jQuery的图片场景标注提示弹窗特效
2015/01/05 Javascript
JavaScript中使用自然对数ln的方法
2015/06/14 Javascript
浅谈jQuery双事件多重加载的问题
2016/10/05 Javascript
JS实现根据用户输入分钟进行倒计时功能
2016/11/14 Javascript
微信小程序 textarea 组件详解及简单实例
2017/01/10 Javascript
使用AngularJS对表单提交内容进行验证的操作方法
2017/07/12 Javascript
在Node.js下运用MQTT协议实现即时通讯及离线推送的方法
2019/01/24 Javascript
简述ES6新增关键字let与var的区别
2019/08/23 Javascript
解决layui 三级联动下拉框更新时回显的问题
2019/09/03 Javascript
js实现列表按字母排序
2020/08/11 Javascript
Python实现方便使用的级联进度信息实例
2015/05/05 Python
pandas 透视表中文字段排序方法
2018/11/16 Python
django-allauth入门学习和使用详解
2019/07/03 Python
python基础教程之while循环
2019/08/14 Python
python 哈希表实现简单python字典代码实例
2019/09/27 Python
Python基于httpx模块实现发送请求
2020/07/07 Python
anaconda3安装及jupyter环境配置全教程
2020/08/24 Python
一文读懂Python 枚举
2020/08/25 Python
CSS3 实现飘动的云朵动画
2020/12/01 HTML / CSS
12个不为大家熟知的HTML5设计小技巧
2016/06/02 HTML / CSS
玛蒂尔达简服装:Matilda Jane Clothing
2019/02/13 全球购物
最新销售员个人自荐信
2013/09/21 职场文书
公司市场部岗位职责
2013/12/02 职场文书
火车的故事教学反思
2014/02/11 职场文书
幼儿园消防演练方案
2014/02/13 职场文书
药学职务聘任书
2014/03/29 职场文书
小学数学教学经验交流材料
2014/05/22 职场文书
领导班子整改措施
2014/10/24 职场文书
致运动员加油稿
2015/07/21 职场文书
感恩老师主题班会
2015/08/12 职场文书