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闭包(Closure)使用详解
May 02 PHP
使用session判断用户登录用户权限(超简单)
Jun 08 PHP
php 验证码(倾斜,正弦干扰线,黏贴,旋转)
Jun 29 PHP
PHP 如何获取二维数组中某个key的集合
Jun 03 PHP
PHP base64编码后解码乱码的解决办法
Jun 19 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十二)
Jun 25 PHP
PHP基于数组实现的分页函数实例
Aug 20 PHP
php通过递归方式复制目录和子目录的方法
Mar 13 PHP
老生常谈PHP面向对象之解释器模式
May 17 PHP
php JWT在web端中的使用方法教程
Sep 06 PHP
详解Laravel服务容器的绑定与解析
Nov 05 PHP
windows系统php环境安装swoole具体步骤
Mar 04 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
PHPlet在Windows下的安装
2006/10/09 PHP
msn上的tab功能Firefox对childNodes处理的一个BUG
2008/01/21 Javascript
用jQuery模拟select下拉框的简单示例代码
2014/01/26 Javascript
javascript实现模拟时钟的方法
2015/05/13 Javascript
JavaScript基本语法学习教程
2016/01/14 Javascript
Dojo获取下拉框的文本和值实例代码
2016/05/27 Javascript
jquery+ajax实现直接提交表单实例分析
2016/06/17 Javascript
JS使用onerror捕获异常示例
2016/08/03 Javascript
利用jQuery.Validate异步验证用户名是否存在(推荐)
2016/12/09 Javascript
EasyUI修改DateBox和DateTimeBox的默认日期格式示例
2017/01/18 Javascript
angular 实时监听input框value值的变化触发函数方法
2018/08/31 Javascript
原生js实现碰撞检测
2020/03/12 Javascript
[16:04]DOTA2海涛带你玩炸弹 9月5日更新内容详解
2014/09/05 DOTA
Python3中的列表生成式、生成器与迭代器实例详解
2018/06/11 Python
Python OpenCV对本地视频文件进行分帧保存的实例
2019/01/08 Python
python 返回一个列表中第二大的数方法
2019/07/09 Python
Django使用 Bootstrap 样式修改书籍列表过程解析
2019/08/09 Python
Python 实用技巧之利用Shell通配符做字符串匹配
2019/08/23 Python
Python scipy的二维图像卷积运算与图像模糊处理操作示例
2019/09/06 Python
python打开使用的方法
2019/09/30 Python
浅谈python中频繁的print到底能浪费多长时间
2020/02/21 Python
TensorFlow2.1.0安装过程中setuptools、wrapt等相关错误指南
2020/04/08 Python
python 安装移动复制第三方库操作
2020/07/13 Python
使用css3实现超炫的loading加载动画效果
2014/05/07 HTML / CSS
韩国三大免税店之一:THE GRAND 中文免税店
2016/07/21 全球购物
怀俄明州飞钓:Platte River Fly Shop
2017/12/28 全球购物
SQL Server笔试题
2012/01/10 面试题
新学期红领巾广播稿
2014/01/14 职场文书
劳动之星获奖感言
2014/02/01 职场文书
项目经理聘任书
2014/03/29 职场文书
办公室文员岗位职责范本
2014/06/12 职场文书
教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
新闻稿怎么写
2015/07/18 职场文书
python自动统计zabbix系统监控覆盖率的示例代码
2021/04/03 Python
Vue+TypeScript中处理computed方式
2022/04/02 Vue.js
python标准库ElementTree处理xml
2022/05/20 Python