ホームページ >php教程 >php手册 >unset を使用して変数を破棄し、PHP でメモリ解放の問題が発生する

unset を使用して変数を破棄し、PHP でメモリ解放の問題が発生する

WBOY
WBOYオリジナル
2016-06-13 11:59:23834ブラウズ

コードをコピー コードは次のとおりです:


for ( $i = 1; $i $ str = str_repeat('01234567', $i);
$a = メモリ_get_usage();
$b = メモリ_get_usage();
".$i.': '.($b - $a).' バイト。';
}


結果から:

8 x 32 = 256 in 256 バイトが長い場合はメモリを解放する必要があります。$str = null を直接実行するよりも速いという人もいます。
結果は次のとおりです:
2: 0 バイト
4: 0 バイト。 🎜>6: 0 バイト。
8: 0 バイト。
11: 0 バイト。 12: 0 バイト。
14: 0 バイト。
17: 0 バイト。 0 バイト。
20: 0 バイト。
23: 0 バイト。 .
25: 0 バイト。
27: 0 バイト。
29: 0 バイト。 🎜>31: 0 バイト。
33: -280 バイト。
35: -296 バイト。バイト。
37: -320 バイト。
40: -344 バイト。 42: - 352 バイト。
44: -368 バイト。
46: -384 バイト。 .
48: -400 バイト。
50: -416 バイト。
52: -432 バイト。 : -440 バイト。
55: -456 バイト。
57: -472 バイト。
59: -488 バイト。
61: -504 バイト。
63: -520 バイト。 -528 バイト。
66: -544 バイト。
68: -568 バイト。 🎜>70: -576 バイト。
72: -592 バイト。
74: -608 バイト。 616 バイト。
77: -632 バイト。
79: -656 バイト。 >81: -664 バイト。
83: -680 バイト。
85: -696 バイト。バイト。
87: -720 バイト。
90: -744 バイト。 92: - 752 バイト。
94: -768 バイト。
96: -784 バイト。 .
98: -800 バイト。

まず例を見てみましょう。



コードをコピーします。 🎜> コードは次のとおりです:


$s=str_repeat('1',255) //255 個の 1 からなる文字列を生成します
$m; =memory_get_usage(); //現在占有されているメモリを取得します
unset($s);
$mm=memory_get_usage(); //unset()後に現在占有されているメモリを確認します
echo $m-$ mm;
?> ;


最後に、unset() 前に占有されていたメモリから unset() 後に占有されたメモリを引いた値を出力します。 $s をメモリから破壊しました (つまり、unset() 後にメモリ使用量が減少しました) が、PHP5 と Windows プラットフォームでは、得られた結果は -48 でした。これは、unset($s) は変数 $s が占有するメモリを破壊しないことを意味しますか?次の例を考えてみましょう:



コードをコピー

コードは次のとおりです:


$s =str_repeat ('1',256); //256 個の文字列を生成します
$m=memory_get_usage(); //現在占有されているメモリを取得します
unset($s); =memory_get_usage(); //unset()後に現在占有されているメモリを確認する
echo
?>


この例は上記とほぼ同じです唯一の違いは、$s が 256 個の 1 で構成されており、最初の例より 1 が 1 つ多く、結果は 224 になることです。これは、unset($s) が $s によって占有されていたメモリを破壊したことを意味しますか?
上記の 2 つの例を通じて、次の結論を導き出すことができます: 結論 1. unset() 関数は、変数値が 256 バイトを超えるメモリ空間を占有している場合にのみメモリ空間を解放できます。
変数の値が 256 を超える限り、unset を使用するとメモリ領域を解放できるでしょうか?別の例でテストしてみましょう:



コードをコピーします

コードは次のとおりです:


$s =str_repeat('1',256); //これは 2 番目の例とまったく同じです
$m=memory_get_usage(); ); / /destroy $s
$mm=memory_get_usage();
echo $p.'
?> 🎜>

' ページを更新すると、最初の行には 256 個の 1 があり、2 行目は -48 であることがわかります。$s を破棄したのは当然であり、$p は $s を参照する単なる変数です。さらに、unset($s) 後のメモリ使用量は、unset() 前に比べて増加しています。次に、次の例を実行してみましょう。

コードをコピーします コードは次のとおりです:


$s= str_repeat('1',256); //これは 2 番目の例とまったく同じです
$p=&$s;
$s=null ; // $s を null に設定します
$mm=memory_get_usage();
echo $m-$mm;


ここで、出力 $p に内容がないことがわかります。unset() の前後でのメモリ使用量の差は 224 です。つまり、変数が占有しているメモリは 224 です。クリアされました。この例の $s=null は、次のように unset() で置き換えることもできます:



コードをコピー

コードは次のとおりです: $s=str_repeat('1',256); //これは 2 番目の例とまったく同じです

$p=&$s; Memory_get_usage();
unset($s); // $s
unset($p);
$mm=memory_get_usage(); ;';
echo $m-$mm;
?>


このとき、メモリ使用量の違いは $s と $p の両方を破棄します。も 224 であり、これによりメモリも解放されることを示します。次に、別の結論が得られます。 結論 2. メモリは、その変数を指すすべての変数 (参照変数など) が破棄された場合にのみ解放されます。
この記事の例を読めば、誰もが unset() について理解できるはずです。少なくとも、私は変数が機能しないときにメモリを解放するために unset() を使用します。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。