【PHP】释放内存的条件

内存的定义是

内存是一种计算机设备,用于存储程序和数据。
虽然经常被类比为桌子,但如果不释放内存中的不必要数据,可能会导致内存溢出错误。

为了释放那些不必要的内存,简要总结如下。

这篇文章的参考资料在下方↓

 

内存释放的条件(变量)

只要变量的数据没有被释放,它将继续存留在内存中。

◎获得解放的条件如下所示↓

    • 「実際のデータの参照が一つ無効になる」時、zvalの参照カウント(zvalのrefcount)を-1した結果、0であればデータはメモリから消滅する。

 

    Garbage Collection Cycleの結果、参照カウントが0であれば、データはメモリから消滅する。

请参阅先前提供的链接以获取详细信息!

嗯,将已定义的变量全部使用完毕后… 就好像这样去理解。

1) 变量有效范围的消失

当变量逃离可使用的范围时,随着有效范围的消失,变量将被释放,实际数据的引用也将变得无效。

function sampleFunc() {
    $local = 'a'; //$localは、function{}の範囲内で有効です。
}
sampleFunc(); // 関数の遂行が合わったあと、a関数内の$localは自動的に解除されます。

2) 取消明确的变量符号(unset)

在php中,有一个名为unset()的函数,可以显式释放变量。

unset(local) : void

3) 重新设置变量符号的引用

当变量符号的引用被重新定义时,先前的引用将会变为无效。

$a = array(0);
$a = array(1); //この時、$aの変数の参照がarray(1)に上書きされ、array(0)に対する参照は無効になる。

内存无法释放的条件

    「実際のデータの参照が一つ無効になる」時、参照カウント(refcount)が「1以上」であれば、データは消滅せずに残り続ける。

1) 如果在相同的范围内存在引用相同数据的变量。

当在同一个函数或范围内存在多个引用相同数据的变量时,即使某个变量被释放,数据也不会消失。

$a = array(0);
$b = $a;

unset($a); 
var_dump($b); //$aの変数を解除しても、$bがarray(0)の参照を持っているため、消滅しない。 

2)如果在不同的作用域中存在引用相同数据的变量。

如果作为函数的参数传递,则由于仍然在上层作用域中引用数据,即使从当前作用域解除变量绑定,数据也不会消失。

function sampleFunc(object $obj) {
    unset($obj); 
    //現在のスコープの$objに対する参照は解放される。
    //しかし、上位スコープにいる$aの変数の参照がまだ有効なため、データは消滅しない。
}

$a = array(0); // このarray(0)は残っている。
sampleFunc($a);

在复合类型变量的内部,如果有变量引用相同的数据

数组、对象等复合类型可以持有数据的引用。
当在内部引用数据时,数据不会消失。

function x(object $obj) {
    $data = array(0); 

    $obj->data = $data;
    //$dataは、x関数の遂行後に解除されますが、stdClassのインスタンスのメンバーとして、array(0)データを参照することになり、データは消滅しません。
}
$a = new \stdClass;
x($a);

最后

通过理解内存概念,可以有效地处理数据,因此我想要学习它。
另外,也会整理关于内存泄漏和垃圾回收的文章。

bannerAds