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&amp;mysql(五)
Oct 09 PHP
PHP 中关于ord($str)&amp;gt;0x80的详细说明
Sep 23 PHP
php生成二维码的几种方式整理及使用实例
Jun 03 PHP
编写安全 PHP应用程序的七个习惯深入分析
Jun 08 PHP
php遍历所有文件及文件夹的方法深入解析
Jun 08 PHP
完美解决thinkphp验证码出错无法显示的方法
Dec 09 PHP
yii2中添加验证码的实现方法
Jan 09 PHP
PHP的Yii框架中移除组件所绑定的行为的方法
Mar 18 PHP
php微信公众平台示例代码分析(二)
Dec 06 PHP
PHP实现的随机红包算法示例
Aug 14 PHP
PHP Primary script unknown 解决方法总结
Aug 22 PHP
Laravel框架源码解析之入口文件原理分析
May 14 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网站在线人数统计
2008/04/09 PHP
php+ajax做仿百度搜索下拉自动提示框(有实例)
2012/08/21 PHP
Codeigniter注册登录代码示例
2014/06/12 PHP
node.js正则表达式获取网页中所有链接的代码实例
2014/06/03 Javascript
jQuery通过控制节点实现仅在前台通过get方法完成参数传递
2015/02/02 Javascript
在Python中使用glob模块查找文件路径的方法
2015/06/17 Javascript
Jquery ajax基础教程
2015/11/20 Javascript
浅谈js对象属性 通过点(.) 和方括号([]) 的不同之处
2016/10/29 Javascript
原生Javascript插件开发实践
2017/01/18 Javascript
js 作用域和变量详解
2017/02/16 Javascript
php 修改密码实现代码
2017/05/24 Javascript
完美解决iview 的select下拉框选项错位的问题
2018/03/02 Javascript
Angular项目如何升级至Angular6步骤全纪录
2018/09/03 Javascript
vue.extend与vue.component的区别和联系
2018/09/19 Javascript
vue解决弹出蒙层滑动穿透问题的方法
2018/09/22 Javascript
JS/CSS实现字符串单词首字母大写功能
2019/09/03 Javascript
VUEX采坑之路之获取不到$store的解决方法
2019/11/08 Javascript
Vue组件模板及组件互相引用代码实例
2020/03/11 Javascript
[00:12]DAC2018 Miracle-站上中单舞台,他能否再写奇迹?
2018/04/06 DOTA
python复制文件的方法实例详解
2015/05/22 Python
学习python 之编写简单乘法运算题
2016/02/27 Python
使用pycharm设置控制台不换行的操作方法
2019/01/19 Python
Python 利用高德地图api实现经纬度与地址的批量转换
2019/08/14 Python
python字符串格式化方式解析
2019/10/19 Python
python使用Geany编辑器配置方法
2020/02/21 Python
Python实现手绘图效果实例分享
2020/07/22 Python
解决Python3.7.0 SSL低版本导致Pip无法使用问题
2020/09/03 Python
美国最大的旗帜经销商:Carrot-Top
2018/02/26 全球购物
工程造价管理专业大专生求职信
2013/10/06 职场文书
我的长生果教学反思
2014/04/28 职场文书
公司感恩节活动策划书
2014/10/11 职场文书
医生学习党的群众路线教育实践活动心得体会
2014/11/03 职场文书
护士个人年终总结
2015/02/13 职场文书
信息技术教研组工作总结
2015/08/13 职场文书
windows系统安装配置nginx环境
2022/06/28 Servers
Java实现贪吃蛇游戏的示例代码
2022/09/23 Java/Android