PHP を unset すると変数が破壊され、メモリの問題が解放されます
以下の内容は、Ah Piao のブログ http://leepiao.blog.163.com/blog/static/485031302010718105814266/ より引用
?
?
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 つ多いことです。これは、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 は $ を参照する単なる変数です。さらに、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() も使用します。