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的栏目导航程序
Oct 09 PHP
模拟OICQ的实现思路和核心程序(二)
Oct 09 PHP
php 小乘法表实现代码
Jul 16 PHP
基于HTTP长连接的&quot;服务器推&quot;技术的php 简易聊天室
Oct 31 PHP
PHP Zip解压 文件在线解压缩的函数代码
May 26 PHP
PHP测试程序运行时间的类
Feb 05 PHP
php获取字段名示例分享
Mar 03 PHP
PHP使用CURL获取302跳转后的地址实例
May 04 PHP
ThinkPHP查询返回简单字段数组的方法
Aug 25 PHP
php 截取中英文混合字符串的方法
May 31 PHP
php压缩文件夹最新版
Jul 18 PHP
php和redis实现秒杀活动的流程
Jul 17 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
利用jQuery操作对象数组的实现代码
2011/04/27 Javascript
jquery下checked取值问题的解决方法
2012/08/09 Javascript
千分位数字格式化(用逗号隔开 代码已做了修改 支持0-9位逗号隔开)的JS代码
2013/12/05 Javascript
浅谈JavaScript函数节流
2014/12/09 Javascript
Vue系列:通过vue-router如何传递参数示例
2017/01/16 Javascript
JS实现直接运行html代码的方法
2017/03/13 Javascript
bootstrap table表格插件使用详解
2017/05/08 Javascript
bootstrap中selectpicker下拉框使用方法实例
2018/03/22 Javascript
js使用ajax传值给后台,后台返回字符串处理方法
2018/08/08 Javascript
vue 自定义指令自动获取文本框焦点的方法
2018/08/25 Javascript
vue 刷新之后 嵌套路由不变 重新渲染页面的方法
2018/09/13 Javascript
Vue项目History模式404问题解决方法
2018/10/31 Javascript
js array数组对象操作方法汇总
2019/03/18 Javascript
利用PHP实现递归删除链表元素的方法示例
2020/10/23 Javascript
Python使用MySQLdb for Python操作数据库教程
2014/10/11 Python
python实现带错误处理功能的远程文件读取方法
2015/04/29 Python
关于numpy中np.nonzero()函数用法的详解
2017/02/07 Python
Python编程之微信推送模板消息功能示例
2017/08/21 Python
python 获取指定文件夹下所有文件名称并写入列表的实例
2018/04/23 Python
使用pandas 将DataFrame转化成dict
2019/12/10 Python
在Python中使用K-Means聚类和PCA主成分分析进行图像压缩
2020/04/10 Python
Keras自动下载的数据集/模型存放位置介绍
2020/06/19 Python
flask开启多线程的具体方法
2020/08/02 Python
肯尼亚网上商城:Kilimall
2016/08/20 全球购物
美国女士时尚珠宝及配饰购物网站:Icing
2018/07/02 全球购物
电影T恤、80年代T恤和80年代服装:TV Store Online
2020/01/05 全球购物
师范毕业生求职自荐信
2013/09/25 职场文书
四年的个人工作自我评价
2013/12/10 职场文书
条幅标语大全
2014/06/20 职场文书
党的群众路线教育实践活动心得体会(企业)
2014/11/03 职场文书
小学优秀学生评语
2014/12/29 职场文书
3.15消费者权益日活动总结
2015/02/09 职场文书
2015感人爱情寄语
2015/02/26 职场文书
革命电影观后感
2015/06/18 职场文书
幼儿园教师暑期培训心得体会
2016/01/09 职场文书
将MySQL的表数据全量导入clichhouse库中
2022/03/21 MySQL