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 17 PHP
PHP如何利用P3P实现跨域
Aug 24 PHP
ThinkPHP惯例配置文件详解
Jul 14 PHP
Thinkphp搭建包括JS多语言的多语言项目实现方法
Nov 24 PHP
php计算给定时间之前的函数用法实例
Apr 03 PHP
[原创]PHP实现逐行删除文件右侧空格的方法
Dec 25 PHP
php数组冒泡排序算法实例
May 06 PHP
ThinkPHP框架表单验证操作方法
Jul 19 PHP
PHP实现动态删除XML数据的方法示例
Mar 30 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
Jun 13 PHP
php生成静态页面并实现预览功能
Jun 27 PHP
laravel5.6实现数值转换
Oct 23 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
Zend Framework教程之Application用法实例详解
2016/03/14 PHP
CI框架实现优化文件上传及多文件上传的方法
2017/01/04 PHP
Laravel框架使用Seeder实现自动填充数据功能
2018/06/13 PHP
js 替换
2008/02/19 Javascript
jquery.combobox中文api和例子,修复了上面的小bug
2011/03/28 Javascript
如何解决Jquery库及其他库之间的$命名冲突
2013/09/15 Javascript
JavaScript编程的10个实用小技巧
2014/04/18 Javascript
js实现按Ctrl+Enter发送效果
2014/09/18 Javascript
node.js中的fs.appendFile方法使用说明
2014/12/17 Javascript
jQuery中html()方法用法实例
2014/12/25 Javascript
JavaScript中原型链存在的问题解析
2016/09/25 Javascript
在vue-cli脚手架中配置一个vue-router前端路由
2017/07/03 Javascript
js实现移动端导航点击自动滑动效果
2017/07/18 Javascript
深入研究React中setState源码
2017/11/17 Javascript
JavaScript实现修改伪类样式
2017/11/27 Javascript
详解webpack babel的配置
2018/01/09 Javascript
详解如何在Vue里建立长按指令
2018/08/20 Javascript
简单易扩展可控性强的Jquery转盘抽奖程序
2019/03/16 jQuery
[01:37]全新的一集《真视界》——TI7总决赛
2017/09/21 DOTA
Python里隐藏的“禅”
2014/06/16 Python
Windows和Linux下使用Python访问SqlServer的方法介绍
2015/03/10 Python
python中随机函数random用法实例
2015/04/30 Python
python实现用户登陆邮件通知的方法
2015/07/09 Python
matplotlib实现区域颜色填充
2019/03/18 Python
Python实现计算对象的内存大小示例
2019/07/10 Python
最小二乘法及其python实现详解
2020/02/24 Python
python 利用opencv实现图像网络传输
2020/11/12 Python
路易威登和香奈儿手袋:LuxeDH
2017/01/12 全球购物
Yummie官方网站:塑身衣和衣柜必需品
2019/10/29 全球购物
无偿献血倡议书
2014/04/14 职场文书
超市商业计划书
2014/05/04 职场文书
男性健康日的活动方案
2014/08/18 职场文书
2014年纪检监察工作总结
2014/11/11 职场文书
争先创优个人总结
2015/03/04 职场文书
创业计划书之溜冰场
2019/10/25 职场文书
解决golang post文件时Content-Type出现的问题
2021/05/02 Golang