PHP の unset は変数を破棄し、メモリを解放します
PHP の unset() 関数は、変数をクリアして破棄するために使用されます。unset() を使用して、未使用の変数を破棄できます。ただし、unset() を使用しても、変数が占有しているメモリを破壊できない場合があります。まず例を見てみましょう:
<?php $s=str_repeat('1',255); //产生由255个1组成的字符串 $m=memory_get_usage(); //获取当前占用内存 unset($s); $mm=memory_get_usage(); //unset()后再查看当前占用内存 echo $m-$mm;
最後に、unset() 前に占有されていたメモリから unset() 後に占有されていたメモリを引いた値を出力します。これが正の数の場合、unset($s) がメモリから $s を破壊したことを意味します (つまり、 unset() の後に占有されるメモリは減少します)。しかし、PHP5 と Windows プラットフォームでは、結果は -48 でした。これは、unset($s) は変数 $s が占有するメモリを破壊しないことを意味しますか?別の例を見てみましょう:
<?php $s=str_repeat('1',256); //产生由256个1组成的字符串 $m=memory_get_usage(); //获取当前占用内存 unset($s); $mm=memory_get_usage(); //unset()后再查看当前占用内存 echo $m-$mm;
この例は上記の例とほぼ同じですが、唯一の違いは、$s が 256 個の 1 で構成されており、最初の例よりも 1 が 1 つ多いことです。結果は 224 です。これは、unset($s) が $s によって占有されていたメモリを破壊したことを意味しますか?
上記の 2 つの例を通じて、次の結論を導き出すことができます: 結論 1. unset() 関数は、変数値が 256 バイトを超えるメモリ空間を占有している場合にのみメモリ空間を解放できます。
変数の値が 256 を超える限り、unset を使用するとメモリ領域を解放できますか?別の例でテストしてみましょう:
<?php $s=str_repeat('1',256); //这和第二个例子完全相同 $p=&$s; $m=memory_get_usage(); unset($s); //销毁$s $mm=memory_get_usage(); echo $p.'<br />'; echo $m-$mm;
ページを更新すると、最初の行には 256 個の 1 があり、2 行目は -48 であることがわかります。$s を破棄したのは当然であり、$p は $s を参照する単なる変数です。さらに、unset($s) 後のメモリ使用量は unset() 前よりも増加しています。次の例を実行してみましょう:
<?php $s=str_repeat('1',256); //这和第二个例子完全相同 $p=&$s; $m=memory_get_usage(); $s=null; //设置$s为null $mm=memory_get_usage(); echo $p.'<br />'; echo $m-$mm;
ここでページを更新すると、出力 $p には内容がなく、unset() の前後のメモリ使用量の差が 224 であることがわかります。つまり、変数によって占有されていたメモリがクリアされています。この例の $s=null は、次のように unset() で置き換えることもできます。
<?php $s=str_repeat('1',256); //这和第二个例子完全相同 $p=&$s; $m=memory_get_usage(); unset($s); //销毁$s unset($p); $mm=memory_get_usage(); echo $p.'<br />'; echo $m-$mm;unset() を使用して $s と $p の両方を破棄すると、メモリ使用量の差も 224 になり、これによってメモリも解放されることがわかります。次に、別の結論が得られます。 結論 2. メモリは、その変数を指すすべての変数 (参照変数など) が破棄された場合にのみ解放されます。
この記事の例を読めば、誰もが unset() について理解できるはずです。少なくとも、私は変数が機能しないときにメモリを解放するために unset() を使用します。