2012-12-29 12 views
6

コードは、私が求めているものをよりよく示しています PHPは関数の終了直後にローカル変数を解放しますか?

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を効率的にそれを行うのですか?あるいは、高価な変数を手動で設定する必要がありますか?

+0

*効率的に - あなたはそのように尋ねることはできません。あなたが考えるものは、効率的なものは何か(おそらくあなたのBTWの質問スタイルによって)実際にPHPが効率的に**何か*なるかもしれないということです。 – hakre

+0

まあ、変数がもう使用されないことが明らかであるとすぐにやります。 –

+0

さらに早く。関数が終了すると、すべてのローカル変数*はなくなります。データが(一時的に)メモリに留まるかどうかは重要ではありません。しかし、私が推測するメモリ管理についてもう少し知る必要があることを知るために、あなたの強み(嫌がらせをしないでください)ではありません。ローカル変数がもはや使用されていないため、システムからメモリブロックをすぐに割り当て解除するには高価になります。 – hakre

答えて

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() 

だから、今あります関数の終了時に変数が破壊されていることを確認してください。

+0

しかし、これは主なスコープには当てはまりません。また、メインスクリプト内のオブジェクト変数を設定して、破壊されたときを見ることもできます。これは、先に明示的にデストラクタを呼び出しても、 'die'終了まで保持されます。 – Voitcus

2

$varがスタックに宣言するとクリアとすぐに、それはスコープ

の外に出たあなたは、だから私は、$ VARは、ある時点で解放されることを知っているこのhttps://stackoverflow.com/a/5971224/307157

+1

私は、あなたが何を述べているかを暗示していることは絶対に何も見ません。そのページは専らセマンティクスに関するものです。その他の参考資料?今は-1です。 – delnan

2

を参照することができます取得されているのではい、それはありますPHPはそれを効率的に行いますか?あるいは、高価な変数を手動で設定する必要がありますか?

はい、PHPはうまくいきます。これは決して考えるべきではありません。あなたの場合、私はむしろ$var = ..return ..の間の瞬間を考えています。なぜなら、それはメモリ消費を避けることができない瞬間だからです。 get_huge_amount_of_data()を介してデータセット全体を取得する必要がなく、必要なデータのみを1つの項目として選択するというソリューションを見つけようとする必要があります。

4

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

あなたは使用してこれを確認することができます。

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(); 

出力:PHPが273312バイトを使用する前に機能

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

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

40バイトの違いは、関数宣言とforループ宣言になりそうです。

関連する問題