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 生成饼图 三维饼图
Sep 28 PHP
JoshChen_web格式编码UTF8-无BOM的小细节分析
Aug 16 PHP
Php header()函数语法及使用代码
Nov 04 PHP
PHP对表单提交特殊字符的过滤和处理方法汇总
Feb 18 PHP
php导出word文档与excel电子表格的简单示例代码
Mar 08 PHP
php合并数组中相同元素的方法
Nov 13 PHP
laravel学习教程之关联模型
Jul 30 PHP
轻松掌握php设计模式之访问者模式
Sep 23 PHP
ajax+php实现无刷新验证手机号的实例
Dec 22 PHP
PHP cURL获取微信公众号access_token的实例
Apr 28 PHP
php生成静态页面并实现预览功能
Jun 27 PHP
Laravel 创建指定表 migrate的例子
Oct 09 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+javascript模拟Matrix画面
2006/10/09 PHP
在PHP中实现Javascript的escape()函数代码
2010/08/08 PHP
PHP pathinfo()获得文件的路径、名称等信息说明
2011/09/13 PHP
解析PHP强制转换类型及远程管理插件的安全隐患
2014/06/30 PHP
Zend Framework实现将session存储在memcache中的方法
2016/03/22 PHP
基于IE下ul li 互相嵌套时的bug,排查,解决过程以及心得介绍
2013/05/07 Javascript
JavaScript操纵窗口的方法小结
2013/06/28 Javascript
javascript实现的简单计时器
2015/07/19 Javascript
在React框架中实现一些AngularJS中ng指令的例子
2016/03/06 Javascript
jQuery实现简单滚动动画效果
2016/04/07 Javascript
js实现的下拉框二级联动效果
2016/04/30 Javascript
浅谈JavaScript for循环 闭包
2016/06/22 Javascript
JS获取本周周一,周末及获取任意时间的周一周末功能示例
2017/02/09 Javascript
jQuery Pagination分页插件_动力节点Java学院整理
2017/07/17 jQuery
js 原生判断内容区域是否滚动到底部的实例代码
2017/11/15 Javascript
微信小程序如何连接Java后台
2019/08/08 Javascript
全面解析js中的原型,原型对象,原型链
2021/01/25 Javascript
python查找指定具有相同内容文件的方法
2015/06/28 Python
利用Python-iGraph如何绘制贴吧/微博的好友关系图详解
2017/11/02 Python
Python图形绘制操作之正弦曲线实现方法分析
2017/12/25 Python
Flask框架Flask-Principal基本用法实例分析
2018/07/23 Python
python 中如何获取列表的索引
2019/07/02 Python
python操作excel让工作自动化
2019/08/09 Python
Python实现链表反转的方法分析【迭代法与递归法】
2020/02/22 Python
selenium WebDriverWait类等待机制的实现
2020/03/18 Python
HTML5中input[type='date']自定义样式与日历校验功能的实现代码
2017/07/11 HTML / CSS
.net软件工程师应聘上机试题
2015/03/10 面试题
生物制药自我鉴定
2014/01/25 职场文书
就业协议书怎么填
2014/09/15 职场文书
父亲婚礼答谢词
2015/01/04 职场文书
党支部季度考核意见
2015/06/02 职场文书
62句有关感恩节文案(推荐收藏)
2019/11/28 职场文书
mysql部分操作
2021/04/05 MySQL
MySQL8.0.24版本Release Note的一些改进点
2021/04/22 MySQL
python numpy中multiply与*及matul 的区别说明
2021/05/26 Python
Golang连接并操作MySQL
2022/04/14 MySQL