PHP对象递归引用造成内存泄漏分析
2015-01-24信息快讯网
这篇文章主要介绍了PHP对象递归引用造成内存泄漏分析,是PHP程序设计中需要加以重视的一个bug,并且有助于深入理解PHP运行原理,需要的朋友可以参考下
通常来说,如果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程序设计有一定的参考价值。
php5.4以下版本json不支持不转义内容中文的解决方法
php正则匹配html中带class的div并选取其中内容的方法
PHP针对JSON操作实例分析
php页面缓存方法小结
php中异常处理方法小结
php模仿asp Application对象在线人数统计实现方法
php运行提示:Fatal error Allowed memory size内存不足的解决方法
PHP内存缓存Memcached类实例
php面象对象数据库操作类实例
php中数字、字符与对象判断函数用法实例
PHP通过内置函数memory_get_usage()获取内存使用情况
PHP PDOStatement对象bindpram()、bindvalue()和bindcolumn之间的区别
PDO预处理语句PDOStatement对象使用总结
PHP对象相互引用的内存溢出实例分析
PHP中cookie和session的区别实例分析
PHP实现视频文件上传完整实例
PHP获取表单所有复选框的值的方法
PHP中echo和print的区别
什么情况下可以不写PHP的闭合标签“?>”
PHP面向对象程序设计之类常量用法实例
PHP面向对象程序设计之接口用法
实例讲解PHP面向对象之多态
PHP中使用json数据格式定义字面量对象的方法
php出现内存位置访问无效错误问题解决方法
CI框架在CLI下执行占用内存过大问题的解决方法
单台服务器的PHP进程之间实现共享内存的方法
PHP 面向对象程序设计(oop)学习笔记 (五) - PHP 命名空间
PHP对象Object的概念 介绍
PHP对象转换为数组函数(递归方法)