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中截取字符串支持utf-8
Jan 18 PHP
基于PHP array数组的教程详解
Jun 05 PHP
PHP CURL获取返回值的方法
May 04 PHP
PHP实现抓取HTTPS内容
Dec 01 PHP
php接口数据加密、解密、验证签名
Mar 12 PHP
php随机显示指定文件夹下图片的方法
Jul 13 PHP
在PHP中使用FastCGI解析漏洞及修复方案
Nov 10 PHP
PHP模板引擎Smarty内置变量调解器用法详解
Apr 11 PHP
php版微信公众平台接口开发之智能回复开发教程
Sep 22 PHP
PHP运行模式汇总
Nov 06 PHP
php常用经典函数集锦【数组、字符串、栈、队列、排序等】
Aug 23 PHP
laravel orm 关联条件查询代码
Oct 21 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一句话cmdshell新型 (非一句话木马)
2009/04/18 PHP
php实现比较两个字符串日期大小的方法
2015/05/12 PHP
PHP结合Mysql数据库实现留言板功能
2016/03/04 PHP
Ecshop 后台添加新功能栏目及管理权限设置教程
2017/11/21 PHP
JavaScript使用prototype定义对象类型(转)[
2006/12/22 Javascript
有一段有意思的代码-javascript现实多行信息
2007/08/26 Javascript
基于JQuery的asp.net树实现代码
2010/11/30 Javascript
用js实现控件的隐藏及style.visibility的使用
2013/06/14 Javascript
jQuery实现可展开合拢的手风琴面板菜单
2015/09/15 Javascript
js两种拼接字符串的简单方法(必看)
2016/09/02 Javascript
angular2中router路由跳转navigate的使用与刷新页面问题详解
2017/05/07 Javascript
随机生成10个不重复的0-100的数字(实例讲解)
2017/08/16 Javascript
PHP自动加载autoload和命名空间的应用小结
2017/12/01 Javascript
JS常用的几种数组遍历方式以及性能分析对比实例详解
2018/04/11 Javascript
详解JavaScript对数组操作(添加/删除/截取/排序/倒序)
2019/04/28 Javascript
JS实现商城秒杀倒计时功能(动态设置秒杀时间)
2019/12/12 Javascript
javascript设计模式 ? 模板方法模式原理与用法实例分析
2020/04/23 Javascript
[02:14]2016国际邀请赛中国区预选赛Ehome晋级之路
2016/07/01 DOTA
python开发之thread线程基础实例入门
2015/11/11 Python
python添加模块搜索路径方法
2017/09/11 Python
python的staticmethod与classmethod实现实例代码
2018/02/11 Python
Python数据报表之Excel操作模块用法分析
2019/03/11 Python
Python递归实现打印多重列表代码
2020/02/27 Python
Python计算IV值的示例讲解
2020/02/28 Python
python程序输出无内容的解决方式
2020/04/09 Python
python从PDF中提取数据的示例
2020/10/30 Python
iphoneX 适配客户端H5页面的方法教程
2017/12/08 HTML / CSS
中国领先的专业演出票务网:永乐票务
2016/08/29 全球购物
香港时尚女装购物网站:ZAFUL
2017/07/19 全球购物
wedgwood加拿大官网:1759年成立的英国国宝级陶瓷餐具品牌
2018/07/17 全球购物
公务员政审单位鉴定材料
2014/05/16 职场文书
2014年秋季开学典礼致辞
2014/08/02 职场文书
2016年优秀教师先进事迹材料
2016/02/26 职场文书
实习报告范文之电话客服岗位
2019/07/26 职场文书
Redis遍历所有key的两个命令(KEYS 和 SCAN)
2021/04/12 Redis
Mysql分库分表之后主键处理的几种方法
2022/02/15 MySQL