您当前的位置: 首页 > 网站编程 > PHP教程 > 【PHP内存泄漏案例】PHP对象递归引用造成内存泄漏

【PHP内存泄漏案例】PHP对象递归引用造成内存泄漏

作者:xiaoxiao 来源:未知 发布时间: 2013-10-12 10:02 点击:
如果PHP对象存在递归引用,就会出现内存泄漏。这个Bug在PHP里已经存在很久很久了,先让我们来重现这个Bug,代码如下: 01?php 02class Foo { 03 function __construct() { 04 $this-bar = new Bar($this); 05 } 06} 07 08class Bar { 09 function __construct($foo) {

【PHP内存泄漏案例】PHP对象递归引用造成内存泄漏

    如果PHP对象存在递归引用,就会出现内存泄漏。这个Bug在PHP里已经存在很久很久了,先让我们来重现这个Bug,代码如下:
  01 <?php
  02 class Foo {
  03     function __construct() {
  04         $this->bar = new Bar($this);
  05     }
  06 }
  07
  08 class Bar {
  09     function __construct($foo) {
  10         $this->foo = $foo;
  11     }
  12 }
  13
  14 for ($i = 0; $i < 100; $i++) {
  15     $obj = new Foo();
  16
  17     unset($obj);
  18
  19     echo memory_get_usage(), "
  20 ";
  21 }
  22 ?>
  运行以上代码,你会发现,内存使用量本应该不变才对,可实际上却是不断增加,unset没有完全生效。
  现在的开发很多都是基于框架进行的,应用里存在复杂的对象关系,那么就很可能会遇到这样的问题,下面看看有什么权宜之计:
  01 <?php
  02 class Foo {
  03     function __construct() {
  04         $this->bar = new Bar($this);
  05     }
  06
  07     function __destruct() {
  08         unset($this->bar);
  09     }
  10 }
  11
  12 class Bar {
  13     function __construct($foo) {
  14         $this->foo = $foo;
  15     }
  16 }
  17
  18 for ($i = 0; $i < 100; $i++) {
  19     $obj = new Foo();
  20
  21     $obj->__destruct();
  22
  23     unset($obj);
  24
  25     echo memory_get_usage(), "
  26 ";
  27 }
  28 ?>
  办法有些丑陋,不过总算是对付过去了。幸运的是这个Bug在PHP5.3的CVS代码中已经被修复了。

分享到:
本文"【PHP内存泄漏案例】PHP对象递归引用造成内存泄漏"由远航站长收集整理而来,仅供大家学习与参考使用。更多网站制作教程尽在远航站长站。
顶一下
(2)
100%
踩一下
(0)
0%
[点击 次] [返回上一页] [打印]
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 密码: 验证码:
关于本站 - 联系我们 - 网站声明 - 友情连接- 网站地图 - 站点地图 - 返回顶部
Copyright © 2007-2013 www.yhzhan.com(远航站长). All Rights Reserved .
远航站长:为中小站长提供最佳的学习与交流平台,提供网页制作与网站编程等各类网站制作教程.
官方QQ:445490277 网站群:26680406 网站备案号:豫ICP备07500620号-4