ホームページ > バックエンド開発 > PHPチュートリアル > PHP の設定解除による変数の破棄とメモリの解放に関連する問題

PHP の設定解除による変数の破棄とメモリの解放に関連する問題

WBOY
リリース: 2016-06-13 13:20:29
オリジナル
1272 人が閲覧しました

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() も使用します。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート