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 相关文章推荐
基于Zend的Config机制的应用分析
May 02 PHP
PHP的curl实现get,post和cookie(实例介绍)
Jun 17 PHP
浅析php单例模式
Nov 25 PHP
php中的动态调用实例分析
Jan 07 PHP
PHP+swoole实现简单多人在线聊天群发
Jan 19 PHP
php正则提取html图片(img)src地址与任意属性的方法
Feb 08 PHP
PHP中Notice错误常见解决方法
Apr 28 PHP
Laravel多用户认证系统示例详解
Mar 13 PHP
ThinkPHP框架中使用Memcached缓存数据的方法
Mar 31 PHP
php项目中类的自动加载实例讲解
Sep 12 PHP
PHP 命名空间和自动加载原理与用法实例分析
Apr 29 PHP
PHP常用header头定义代码示例汇总
Aug 29 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面向对象全攻略 (十一)__toString()用法 克隆对象 __call处理调用错误
2009/09/30 PHP
php安全配置 如何配置使其更安全
2011/12/16 PHP
php从数组中随机抽取一些元素的代码
2012/11/05 PHP
destoon在360浏览器下出现用户被强行注销的解决方法
2014/06/26 PHP
php命令行用法入门实例教程
2014/10/27 PHP
PHP生成不重复标识符的方法
2014/11/21 PHP
PHP全功能无变形图片裁剪操作类与用法示例
2017/01/10 PHP
thinkPHP5.1框架中Request类四种调用方式示例
2019/08/03 PHP
javascript数组使用调用方法汇总
2007/12/08 Javascript
IE和Firefox下javascript的兼容写法小结
2008/12/10 Javascript
JS图片切换的具体方法(带缩略图版)
2013/11/12 Javascript
javascript实现动态统计图开发实例
2015/11/21 Javascript
易操作的jQuery表单提示插件
2015/12/01 Javascript
bootstrapValidator bootstrap-select验证不可用的解决办法
2017/01/11 Javascript
详解Vue路由钩子及应用场景(小结)
2017/11/07 Javascript
Vue中的slot使用插槽分发内容的方法
2018/03/01 Javascript
Vue 项目代理设置的优化
2018/04/17 Javascript
Vue 动态设置路由参数的案例分析
2018/04/24 Javascript
vue采用EventBus实现跨组件通信及注意事项小结
2018/06/14 Javascript
JS实现数组去重,显示重复元素及个数的方法示例
2019/01/21 Javascript
JavaScript高阶教程之“==”隐藏下的类型转换
2019/04/11 Javascript
深入解析vue 源码目录及构建过程分析
2019/04/24 Javascript
axios封装,使用拦截器统一处理接口,超详细的教程(推荐)
2019/05/02 Javascript
vue动态设置页面title的方法实例
2020/08/23 Javascript
Python3内置模块之json编解码方法小结【推荐】
2020/12/09 Python
python flask web服务实现更换默认端口和IP的方法
2019/07/26 Python
Python中使用aiohttp模拟服务器出现错误问题及解决方法
2020/10/31 Python
html5 canvas 使用示例
2010/10/22 HTML / CSS
澳大利亚网上买书:Angus & Robertson
2019/07/21 全球购物
实习自我评价怎么写
2013/12/02 职场文书
农民工工资保障承诺书
2015/05/04 职场文书
2015年电话客服工作总结
2015/05/18 职场文书
动画《平凡职业成就世界最强》宣布制作OVA
2022/04/01 日漫
Java 死锁解决方案
2022/05/11 Java/Android
MySQL数据库实验实现简单数据库应用系统设计
2022/06/21 MySQL
Win10系统搭建ftp文件服务器详细教程
2022/08/05 Servers