PHP對(duì)象遞歸引用造成內(nèi)存泄漏分析
通常來說,如果PHP對(duì)象存在遞歸引用,就會(huì)出現(xiàn)內(nèi)存泄漏。這個(gè)Bug在PHP里已經(jīng)存在很久很久了,先讓我們來重現(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沒有完全生效。
現(xiàn)在的開發(fā)很多都是基于框架進(jìn)行的,應(yīng)用里存在復(fù)雜的對(duì)象關(guān)系,那么就很可能會(huì)遇到這樣的問題,下面看看有什么權(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";
}
?>
辦法有些丑陋,不過總算是對(duì)付過去了。幸運(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)加載類文件,命名空間
- 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í)特性詳解(接口,繼承,抽象類,析構(gòu),克隆等)
- php中對(duì)象引用和復(fù)制實(shí)例分析
相關(guān)文章
PHP表單遞交控件名稱含有點(diǎn)號(hào)(.)會(huì)被轉(zhuǎn)化為下劃線(_)的處理方法
做項(xiàng)目的過程中發(fā)現(xiàn),表單遞交就是不成功,后來發(fā)現(xiàn)原來我給控件的名字不規(guī)范導(dǎo)致,控件遞交到后端之后,發(fā)現(xiàn)所有我控件名字中含有.號(hào)的名字,遞交過之后都會(huì)被轉(zhuǎn)化成下劃線_2013-01-01
PHP高并發(fā)高負(fù)載下的3種實(shí)戰(zhàn)場(chǎng)景解決方法示例
這篇文章主要為大家介紹了PHP高并發(fā)高負(fù)載下的3種實(shí)戰(zhàn)場(chǎng)景解決方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
PHP實(shí)現(xiàn)清除wordpress里惡意代碼
這篇文章主要介紹了PHP實(shí)現(xiàn)清除wordpress里惡意代碼的方法以及相關(guān)代碼和使用方法,有需要的小伙伴可以參考下。2015-10-10
snoopy PHP版的網(wǎng)絡(luò)客戶端提供本地下載
snoopy是非常不錯(cuò)的模仿網(wǎng)絡(luò)客戶端的php類,但提供本地下載的很少,國(guó)外的下載又麻煩而且又慢,所以我弄到本站方便大家下載2008-04-04
探討PHP中OO之靜態(tài)關(guān)鍵字以及類常量的詳解
本篇文章是對(duì)php中的靜態(tài)關(guān)鍵字以及類常量進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
PHP 用數(shù)組降低程序的時(shí)間復(fù)雜度
時(shí)間復(fù)雜度是開發(fā)人員用來衡量應(yīng)用程序算法優(yōu)劣的主要因素??陀^地說,算法的優(yōu)劣除了和時(shí)間復(fù)雜度有關(guān),還與空間復(fù)雜度密切相關(guān)。2009-12-12

