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实现的随机广告显示代码
Jun 14 PHP
php学习之流程控制实现代码
Jun 09 PHP
discuz免激活同步登入代码修改方法(discuz同步登录)
Dec 24 PHP
使用PHP破解防盗链图片的一个简单方法
Jun 07 PHP
PHP数组编码gbk与utf8互相转换的两种方法
Sep 01 PHP
php使用preg_match()函数验证ip地址的方法
Jan 07 PHP
yii2中dropDownList实现二级和三级联动写法
Apr 26 PHP
PHP两个n位的二进制整数相加问题的解决
Aug 26 PHP
PHP赋值的内部是如何跑的详解
Jan 13 PHP
Laravel配置全局公共函数的方法步骤
May 09 PHP
tp5.1 实现setInc字段自动加1
Oct 18 PHP
Centos7安装swoole扩展操作示例
Mar 26 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默认安装产生系统漏洞
2006/10/09 PHP
在PHP里得到前天和昨天的日期的代码
2007/08/16 PHP
smarty的保留变量问题
2008/10/23 PHP
php设计模式 Template (模板模式)
2011/06/26 PHP
使用php发送有附件的电子邮件-(PHPMailer使用的实例分析)
2013/04/26 PHP
PHP实现的多文件上传类及用法示例
2016/05/06 PHP
php+mysql+jquery实现简易的检索自动补全提示功能
2017/04/15 PHP
javascript 密码强度验证规则、打分、验证(给出前端代码,后端代码可根据强度规则翻译)
2010/05/18 Javascript
基于jQuery的试卷自动排版系统实现代码
2011/01/06 Javascript
用js来刷新当前页面保留参数的具体实现
2013/12/23 Javascript
jQuery判断多个input file 都不能为空的例子
2015/06/23 Javascript
asp.net+jquery.form实现图片异步上传的方法(附jquery.form.js下载)
2016/05/05 Javascript
jQuery Ajax 上传文件处理方式介绍(推荐)
2016/06/30 Javascript
Javascript使用uploadify来实现多文件上传
2016/11/16 Javascript
微信小程序 特效菜单抽屉效果实例代码
2017/01/11 Javascript
深入浅析javascript函数中with
2018/10/28 Javascript
如何在Vue.js中实现标签页组件详解
2019/01/02 Javascript
layui清空,重置表单数据的实例
2019/09/12 Javascript
element-ui 远程搜索组件el-select在项目中组件化的实现代码
2019/12/04 Javascript
jquery实现简单自动轮播图效果
2020/07/29 jQuery
js实现点击按钮随机生成背景颜色
2020/09/05 Javascript
[54:18]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS BO3 第一场 1月22日
2021/03/11 DOTA
Python命令行参数解析模块getopt使用实例
2015/04/13 Python
Python切片知识解析
2016/03/06 Python
python使用Plotly绘图工具绘制散点图、线形图
2019/04/02 Python
pandas的排序和排名的具体使用
2019/07/31 Python
使用Pyhton集合set()实现成果查漏的例子
2019/11/24 Python
OpenCV里的imshow()和Matplotlib.pyplot的imshow()的实现
2019/11/25 Python
Python抓新型冠状病毒肺炎疫情数据并绘制全国疫情分布的代码实例
2020/02/05 Python
TensorFlow使用Graph的基本操作的实现
2020/04/22 Python
简述你对Statement,PreparedStatement,CallableStatement的理解
2013/03/25 面试题
暑期社会实践学生的自我评价
2014/01/09 职场文书
员工旷工检讨书
2015/08/15 职场文书
员工升职自我评价
2019/03/26 职场文书
教你怎么用Python实现GIF动图的提取及合成
2021/06/15 Python
SQL试题 使用窗口函数选出连续3天登录的用户
2022/04/24 Oracle