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

