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 防止单引号,双引号在接受页面转义
Jul 10 PHP
PHP通用分页类page.php[仿google分页]
Aug 31 PHP
40个迹象表明你还是PHP菜鸟
Sep 29 PHP
PHP的变量总结 新手推荐
Apr 18 PHP
php连接mssql数据库的几种方法
Feb 21 PHP
web server使用php生成web页面的三种方法总结
Oct 28 PHP
php+jQuery.uploadify实现文件上传教程
Dec 26 PHP
php中memcache 基本操作实例
May 17 PHP
composer.lock文件的作用
Feb 03 PHP
Yii多表联合查询操作详解
Jun 02 PHP
PHP读取CSV大文件导入数据库的实例
Jul 24 PHP
ThinkPHP 3.2.3实现加减乘除图片验证码
Dec 05 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
基于AppServ,XAMPP,WAMP配置php.ini去掉警告信息(NOTICE)的方法详解
2013/05/07 PHP
解析php开发中的中文编码问题
2013/08/08 PHP
XAMPP安装与使用方法详细解析
2013/11/27 PHP
PHP实现验证码校验功能
2017/11/16 PHP
jquery 经典动画菜单效果代码
2010/01/26 Javascript
Jquery 插件开发笔记整理
2011/01/17 Javascript
分享33个jQuery与CSS3实现的绚丽鼠标悬停效果
2014/12/15 Javascript
EasyUI中datagrid在ie下reload失败解决方案
2015/03/09 Javascript
nodejs简单实现中英文翻译
2015/05/04 NodeJs
vue.js,ajax渲染页面的实例
2018/02/11 Javascript
使用use注册Vue全局组件和全局指令的方法
2018/03/08 Javascript
NodeJS如何实现同步的方法示例
2018/08/24 NodeJs
ajax与jsonp的区别及用法
2018/10/16 Javascript
JavaScript定时器设置、使用与倒计时案例详解
2019/07/08 Javascript
VUE写一个简单的表格实例
2019/08/06 Javascript
JavaScript正则表达式验证登录实例
2020/03/18 Javascript
JS实现选项卡插件的两种写法(jQuery和class)
2020/12/30 jQuery
python在windows下实现备份程序实例
2014/07/04 Python
Python 正则表达式实现计算器功能
2017/04/29 Python
python简单贪吃蛇开发
2019/01/28 Python
Python中Numpy mat的使用详解
2019/05/24 Python
python3爬虫GIL修改多线程实例讲解
2020/11/24 Python
一款利用html5和css3实现的3D立方体旋转效果教程
2016/04/26 HTML / CSS
CSS3的resize属性使用初探
2015/09/27 HTML / CSS
日本无添加化妆品:HABA
2016/08/18 全球购物
西班牙网上书店:Casa del Libro
2016/11/01 全球购物
南非最大的在线时尚商店:Zando
2019/07/21 全球购物
后勤岗位职责
2013/11/26 职场文书
资金主管岗位职责范本
2014/03/04 职场文书
小学班主任培训方案
2014/06/04 职场文书
建筑工地文明标语
2014/10/09 职场文书
学校食品安全责任书
2015/01/29 职场文书
2015年高二班主任工作总结
2015/05/25 职场文书
四十年同学聚会致辞
2015/07/28 职场文书
学前班教学反思
2016/02/24 职场文书
springboot 启动如何排除某些bean的注入
2021/08/02 Java/Android