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 相关文章推荐
PHP4在WinXP下IIS和Apache2服务器上的安装实例
Oct 09 PHP
PHP中的日期及时间
Nov 23 PHP
MySQL修改密码方法总结
Mar 25 PHP
php中将数组存到文件里的实现代码
Jan 19 PHP
php使用SAE原生Mail类实现各种类型邮件发送的方法
Oct 10 PHP
浅谈PHP拦截器之__set()与__get()的理解与使用方法
Oct 18 PHP
PHP实现的DES加密解密封装类完整实例
Apr 29 PHP
php实现构建排除当前元素的乘积数组方法
Oct 06 PHP
详解关于php的xdebug配置(编辑器vscode)
Jan 29 PHP
PHP获取访问设备信息的方法示例
Feb 20 PHP
PHP+redis实现微博的拉模型案例详解
Jul 10 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
Apr 02 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创建无限级树型菜单
2015/11/05 PHP
PHP5.2中PDO的简单使用方法
2016/03/25 PHP
PHP二维数组去重算法
2016/12/17 PHP
关于window.pageYOffset和document.documentElement.scrollTop
2011/04/05 Javascript
删除select中所有option选项jquery代码
2013/08/12 Javascript
jQuery学习笔记之jQuery中的$
2015/01/19 Javascript
bootstrap输入框组代码分享
2016/06/07 Javascript
值得分享的JavaScript实现图片轮播组件
2016/11/21 Javascript
微信小程序注册60s倒计时功能 使用JS实现注册60s倒计时功能
2017/08/16 Javascript
在vue中封装可复用的组件方法
2018/03/01 Javascript
node.js中TCP Socket多进程间的消息推送示例详解
2018/07/10 Javascript
springMvc 前端用json的方式向后台传递对象数组方法
2018/08/07 Javascript
vue spa应用中的路由缓存问题与解决方案
2019/05/31 Javascript
详解小程序如何改变onLoad的执行时机
2019/11/01 Javascript
JS实现省市县三级下拉联动
2020/04/10 Javascript
[02:31]《DAC最前线》之选手酒店现场花絮
2015/01/30 DOTA
如何搜索查找并解决Django相关的问题
2014/06/30 Python
使用grappelli为django admin后台添加模板
2014/11/18 Python
Python 记录日志的灵活性和可配置性介绍
2018/02/27 Python
Python拼接微信好友头像大图的实现方法
2018/08/01 Python
利用Python小工具实现3秒钟将视频转换为音频
2019/10/29 Python
matplotlib绘制正余弦曲线图的实现
2021/02/22 Python
js实现移动端H5页面手指滑动刻度尺功能
2017/11/16 HTML / CSS
html5 offlline 缓存使用示例
2013/06/24 HTML / CSS
逼真的HTML5树叶飘落动画
2016/03/01 HTML / CSS
美国南部最大的家族百货公司:Belk
2017/01/30 全球购物
英国知名美妆护肤在线商城:Zest Beauty
2018/04/24 全球购物
奢华时尚的独特视角:La Garçonne
2018/06/07 全球购物
校园联欢晚会主持词
2014/03/17 职场文书
《生命 生命》教学反思
2014/04/19 职场文书
市场开发计划书
2014/05/07 职场文书
学雷锋活动总结报告
2014/06/26 职场文书
同事打架检讨书
2015/05/06 职场文书
创业计划书之熟食店
2019/10/16 职场文书
mysql使用instr达到in(字符串)的效果
2022/04/03 MySQL
Python matplotlib绘制条形统计图 处理多个实验多组观测值
2022/04/21 Python