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简洁函数(PHP简单明了函数语法)
Jun 10 PHP
解析PHP中ob_start()函数的用法
Jun 24 PHP
php根据指定位置和长度获得子字符串的方法
Mar 17 PHP
smarty模板引擎基础知识入门
Mar 30 PHP
Ubuntu下安装PHP的mongodb扩展操作命令
Jul 04 PHP
如何使用微信公众平台开发模式实现多客服
Jan 06 PHP
php 使用curl模拟登录人人(校内)网的简单实例
Jun 06 PHP
Zend Framework入门教程之Zend_Registry组件用法详解
Dec 09 PHP
php生成0~1随机小数的方法(必看)
Apr 05 PHP
PHP封装的简单连接MongoDB类示例
Feb 13 PHP
laravel ORM关联关系中的 with和whereHas用法
Oct 16 PHP
php设计模式之抽象工厂模式分析【星际争霸游戏案例】
Jan 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
一步一步学习PHP(4) php 函数 补充2
2010/02/15 PHP
ThinkPHP使用Smarty第三方插件方法小结
2016/03/19 PHP
php遍历替换目录下文件指定内容的方法
2016/11/10 PHP
详解PHP中的 input属性(隐藏 只读 限制)
2017/08/14 PHP
使用Rancher在K8S上部署高性能PHP应用程序的教程
2020/07/10 PHP
DOM 基本方法
2009/07/18 Javascript
js兼容的placeholder属性详解
2013/08/18 Javascript
jQuery+AJAX实现遮罩层登录验证界面(附源码)
2020/09/13 Javascript
Angularjs实现分页和分页算法的示例代码
2016/12/23 Javascript
在js代码拼接dom对象到页面上去的模板总结(必看)
2017/02/14 Javascript
vuex 使用文档小结篇
2018/01/11 Javascript
基于vue2.0动态组件及render详解
2018/03/17 Javascript
浅谈React之状态(State)
2018/09/19 Javascript
详解 微信小程序开发框架(MINA)
2019/05/17 Javascript
js实现点击选项置顶动画效果
2020/08/25 Javascript
vue项目开启Gzip压缩和性能优化操作
2020/10/26 Javascript
python pickle 和 shelve模块的用法
2013/09/16 Python
python对DICOM图像的读取方法详解
2017/07/17 Python
python pandas dataframe 按列或者按行合并的方法
2018/04/12 Python
Python交互环境下实现输入代码
2018/06/22 Python
浅谈python的dataframe与series的创建方法
2018/11/12 Python
关于 Python opencv 使用中的 ValueError: too many values to unpack
2019/06/28 Python
浅谈关于html5中图片抛物线运动的一些心得
2018/01/09 HTML / CSS
美国摩托车头盔、零件、齿轮及配件商店:Cycle Gear
2019/06/12 全球购物
VICHY薇姿俄罗斯官方网上商店:法国护肤品牌,火山温泉水
2019/11/22 全球购物
中学教师实习自我鉴定
2013/09/28 职场文书
超市中秋节促销方案
2014/03/21 职场文书
公务员上班玩游戏检讨书
2014/09/17 职场文书
公司离职证明标准格式
2014/11/18 职场文书
小学四年级学生评语
2014/12/26 职场文书
二手车转让协议书
2015/01/29 职场文书
收费员岗位职责
2015/02/14 职场文书
2015年质量月活动总结报告
2015/03/27 职场文书
找规律教学反思
2016/02/23 职场文书
Python实现简繁体转换
2021/06/07 Python
Windows server 2016服务器基本设置
2022/08/14 Servers