PHP對象遞歸引用造成內(nèi)存泄漏分析
通常來說,如果PHP對象存在遞歸引用,就會出現(xiàn)內(nèi)存泄漏。這個Bug在PHP里已經(jīng)存在很久很久了,先讓我們來重現(xiàn)這個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";
}
?>
運行以上代碼,你會發(fā)現(xiàn),內(nèi)存使用量本應該不變才對,可實際上卻是不斷增加,unset沒有完全生效。
現(xiàn)在的開發(fā)很多都是基于框架進行的,應用里存在復雜的對象關系,那么就很可能會遇到這樣的問題,下面看看有什么權宜之計:
<?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代碼中已經(jīng)被修復了。
對此,在進行PHP程序設計時有必要加以注意!相信本文所述對大家的PHP程序設計有一定的參考價值。
- php面向?qū)ο笕ヂ?(三)特殊的引用“$this”的使用
- PHP對象相互引用的內(nèi)存溢出實例分析
- php中引用&的用法分析【變量引用,函數(shù)引用,對象引用】
- php5對象復制、clone、淺復制與深復制實例詳解
- PHP對象的淺復制與深復制的實例詳解
- PHP動態(tài)地創(chuàng)建屬性和方法, 對象的復制, 對象的比較,加載指定的文件,自動加載類文件,命名空間
- PHP 5.0對象模型深度探索之對象復制
- php面向?qū)ο笕ヂ?(十一)__toString()用法 克隆對象 __call處理調(diào)用錯誤
- php實現(xiàn)對象克隆的方法
- PHP對象克隆clone用法示例
- PHP面向?qū)ο蟪绦蛟O計高級特性詳解(接口,繼承,抽象類,析構(gòu),克隆等)
- php中對象引用和復制實例分析
相關文章
windows服務器中檢測PHP SSL是否開啟以及開啟SSL的方法
這篇文章主要介紹了windows服務器中檢測PHP SSL是否開啟以及開啟SSL的方法,需要的朋友可以參考下2014-04-04
PHP實現(xiàn)的pdo連接數(shù)據(jù)庫并插入數(shù)據(jù)功能簡單示例
這篇文章主要介紹了PHP實現(xiàn)的pdo連接數(shù)據(jù)庫并插入數(shù)據(jù)功能,結(jié)合簡單示例形式分析了pdo數(shù)據(jù)庫連接及執(zhí)行基本的插入SQL語句相關操作技巧,需要的朋友可以參考下2019-03-03
使用php實現(xiàn)網(wǎng)站驗證碼功能【推薦】
本文主要介紹了使用php實現(xiàn)網(wǎng)站驗證碼功能的方法。具有很好的參考價值,下面跟著小編一起來看下吧2017-02-02
解析Extjs與php數(shù)據(jù)交互(增刪查改)
本篇文章是對Extjs與php數(shù)據(jù)交互(增刪查改)進行了詳細的分析介紹,需要的朋友參考下2013-06-06

