4

重複の可能性:
PHP でメモリを解放するのに適しているもの: unset() または $var = null

ガベージ コレクションに関する限り、どのような状況でもどちらが優れているのでしょうか。

編集:特に$var、再帰やその他のオブジェクトのレベルが多数ある非常に大きな変数の場合(大きなオブジェクトの再帰的なクリーンアップを行うため)

編集:これを削除しました:私は1つのことしか考えられません。それisset($var)は、どちらの場合でも異なる応答をすることです。

どうやら私が間違っていたようです.2人とも同じ反応を示します。

4

3 に答える 3

4
unset($var);
// You will get Undefined variable Notice.
if ($var) {}

$var = null;
// it's ok.
if ($var) {}

phpのGCの追加。

PHPのガベージコレクションはのに基づいており、refcount0になると、zvalを解放できます。refcountzval

したがって、の場合$a = $b = array(/*a very large array*/);、設定を解除するか、ラージアレイのメモリを解放しない$aだけです。$b

unset($a);または、 $a = nullまたはに別の値を割り当てる$aと、すべて1ずつ減少しますが、メモリは0refcountに減少した場合にのみ解放されます。refcount

于 2012-08-02T02:17:45.710 に答える
3

unset即時のメモリ解放を強制するのではなく、gc に任せます。$var = null;ただし、即時のメモリ解放を強制します。

例を参照してください:

 // $a = NULL; (better I think)
 $a = 5;
 $b = & $a;
 $a = NULL;
 print "b $b "; // b 
 print(! isset($b)); // 1 
 ?>

配列の場合destroys、変数を完全に設定解除することにも注意してください。すなわち:

<?php
$ar = array(1,2,3,4);
var_dump($ar);
echo "<br />";

unset($ar[2]);
var_dump($ar);
echo "<br />";

$ar[1] = null;
var_dump($ar);
?>

出力を返します。

array(4) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) } 
array(3) { [0]=> int(1) [1]=> int(2) [3]=> int(4) } 
array(3) { [0]=> int(1) [1]=> NULL [3]=> int(4) }
于 2012-08-02T02:26:25.133 に答える
2
$a = 5;
$b = &$a;
unset($b); //just say $b should not pointer to any var
print $a; // 5


$a = 5;
$b = &$a;
$b = null;
print $a; // nothing, because $a = null
于 2012-08-02T02:26:05.267 に答える