8

コードは私が求めているものをよりよく示しています:

function foo(){

  $var = get_huge_amount_of_data();

  return $var[0];
}


$s = foo();

// is memory freed here for the $var variable created above?

do_other_stuff(); // need memory here lol

だから私は$varがいつか解放されることを知っていますが、PHPはそれを効率的に行いますか?または、高価な変数の設定を手動で解除する必要がありますか?

4

4 に答える 4

8

はい、それは解放されます。

これは、次を使用して確認できます。

function a() {
    $var = "Hello World";
    $content = "";
    for ($i = 0; $i < 10000; $i++) {
        $content .= $var;
    }
    print '<br>$content size:'.strlen($content);
    print '<br>memory in function:'.memory_get_usage();
    return null;
}

print '<br>memory before function:'.memory_get_usage();
a();
print '<br>memory after function:'.memory_get_usage();

出力:

memory before function:273312
$content size:110000
memory in function:383520
memory after function:273352

関数の前に、PHPは273312バイトを使用していました。
関数が終了する前に、メモリ使用量を再度
確認し、383520を使用しました。$contentのサイズである110000バイトを確認しました。
273312 + 110000 = 383312
残りの208バイトは他の変数からのものです($ contentのみをカウントしました)
関数が終了した後、メモリ使用量を再度チェックし、以前とほぼ同じ(ほぼ(40バイトの差))に戻りました。

40バイトの違いは、関数宣言とforループ宣言である可能性があります。

于 2015-04-01T18:42:05.290 に答える
3

この例はクラスで見ることができます。これは、クラスのデストラクタで変数を「キャッチ」して解放できるためです。

class a {
  function __destruct(){
    echo "destructor<br>";
  }
}

function b(){ // test function
  $c=new a();
  echo 'exit from function b()<br>';
}

echo "before b()<br>";
b();
echo "after b()<br>";

die();

このスクリプトは以下を出力します:

before b()
exit from function b()
destructor
after b()

したがって、変数が関数の終了時に破棄されることは明らかです。

于 2013-03-26T20:02:46.320 に答える
2

はい、それは$varスタック上で宣言され、スコープ外になるとすぐにクリアされるためです

あなたはこれを参照することができますhttps://stackoverflow.com/a/5971224/307157

于 2012-12-29T15:02:46.567 に答える
2

だから私は$varがいつか解放されることを知っていますが、PHPはそれを効率的に行いますか?または、高価な変数の設定を手動で解除する必要がありますか?

はい、PHPは良い仕事をします。これはあなたが決して考える必要のない質問です。あなたの場合、私はむしろとの間の瞬間について考えたいと思います$var = ..return ..なぜなら、それはあなたがメモリ消費を避けられない瞬間だからです。get_huge_amount_of_data()を介してデータセット全体をフェッチしてから単一のアイテムを選択する必要はなく、必要なデータのみを選択するという解決策を見つけるようにしてください。

于 2012-12-29T15:14:40.870 に答える