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 相关文章推荐
改变Apache端口等配置修改方法
Jun 05 PHP
彻底杜绝PHP的session cookie错误
Aug 09 PHP
PHP加密扩展库Mcrypt安装和实例
Nov 10 PHP
js和php邮箱地址验证的实现方法
Jan 09 PHP
php像数组一样存取和修改字符串字符
Mar 21 PHP
thinkphp浏览历史功能实现方法
Oct 29 PHP
ecshop 2.72如何修改后台访问地址
Mar 03 PHP
PHP可变函数学习小结
Nov 29 PHP
THinkPHP获取客户端IP与IP地址查询的方法
Nov 14 PHP
详解PHP神奇又有用的Trait
Mar 25 PHP
PHP全局使用Laravel辅助函数dd
Dec 26 PHP
php png失真的原因及解决办法
Oct 24 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
JSON在PHP中的应用介绍
2012/09/08 PHP
mysql,mysqli,PDO的各自不同介绍
2012/09/19 PHP
基于PHP实现等比压缩图片大小
2016/03/04 PHP
CI框架(CodeIgniter)实现的数据库增删改查操作总结
2018/05/23 PHP
jquery自定义类似$.ajax()的方法实现代码
2013/08/13 Javascript
JavaScript图片放大技术(放大镜)实现代码分享
2013/11/14 Javascript
基于javascript实现简单计算器功能
2016/01/03 Javascript
jQuery中bind(),live(),delegate(),on()绑定事件方法实例详解
2016/01/19 Javascript
JS获取时间的相关函数及时间戳与时间日期之间的转换
2016/02/04 Javascript
jQuery中iframe的操作(点击按钮新增窗口)
2016/04/20 Javascript
JavaScript实现相册弹窗功能(zepto.js)
2016/06/21 Javascript
JS生成不重复的随机数组的简单实例
2016/07/10 Javascript
vue自定义指令实现v-tap插件
2016/11/03 Javascript
JS实现评价的星星功能
2017/08/20 Javascript
JavaScript实现body内任意节点的自定义属性功能示例
2017/09/18 Javascript
详解VueJS应用中管理用户权限
2018/02/02 Javascript
async/await优雅的错误处理方法总结
2019/01/30 Javascript
JS实现的冒泡排序,快速排序,插入排序算法示例
2019/03/02 Javascript
js控制随机数生成概率代码实例
2019/03/21 Javascript
微信小程序换肤功能实现代码(思路详解)
2020/08/25 Javascript
[01:05:32]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#1COL VS Alliance第一局
2016/03/04 DOTA
跟老齐学Python之使用Python查询更新数据库
2014/11/25 Python
面向对象学习之pygame坦克大战
2019/09/11 Python
基于python计算滚动方差(标准差)talib和pd.rolling函数差异详解
2020/06/08 Python
韩国三星集团旗下时尚品牌官网:SSF SHOP
2016/08/02 全球购物
全球虚拟主机商:HostGator
2017/02/06 全球购物
英国最大的美妆产品在线零售商之一:Beauty Bay
2017/09/29 全球购物
Hotels.com英国:全球领先的酒店住宿提供商
2019/01/24 全球购物
凯蒂·佩里个人女鞋品牌:Katy Perry Collections
2019/04/04 全球购物
合作经营协议书范本
2014/04/17 职场文书
学校三节实施方案
2014/06/09 职场文书
2015年幼儿园元旦游艺活动策划书
2014/12/09 职场文书
小学班主任工作随笔
2015/08/15 职场文书
单位病假条范文
2015/08/17 职场文书
笔记本自带的win11如何跳过联网激活?
2022/04/20 数码科技
python中validators库的使用方法详解
2022/09/23 Python