【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);
最后
通过理解内存概念,可以有效地处理数据,因此我想要学习它。
另外,也会整理关于内存泄漏和垃圾回收的文章。