2

unset()メモリを取得したり、いくつかの変数を宣言したり(構造に関係なく)、どこでも言語構造を使用することに興味があります。

つまり、誰かが変数を宣言するとき、それを実際にGCunset()に残す必要があるのはいつですか?


例 1:

<?php
$buffer = array(/* over 1000 elements  */);

// 1) some long code, that uses $buffer

// 2) some long code, that does not use $buffer
?>
  1. ポイント2$bufferのパフォーマンスに影響を与える可能性はありますか?
  2. ポイント 2unset($buffer)に入る前に、本当にする必要がありますか (またはする必要がありますか)。

例 2:

<?php
function someFunc(/* some args */){
    $buffer = new VeryLargeObject();

    // 1) some actions with $buffer methods and properties

    // 2) some actions without usage of $buffer

    return $something;
}
?>
  1. ポイント 2に入る前に、私は本当に s の体内で行う必要がありますか (またはする必要がありますunset($buffer)か) ?someFunc()
  2. 関数が終了するか、ステートメントを見つけるときに、s スコープGC内で割り当てられたすべてのメモリ (参照とオブジェクトを含む) を解放しますか?someFunc()return

技術的な説明に興味がありますが、コード スタイルの提案も大歓迎です。

ありがとう。

4

1 に答える 1

1

PHP では、スクリプトの終了後にすべてのメモリがクリーンアップされ、ほとんどの場合はそれで十分です。

php.netから:

unset() は、その名前が示すとおり、変数の設定を解除します。すぐにメモリを解放することは強制されません。PHP のガベージ コレクターは、適切と思われる場合にそれを実行します。意図的に、これらの CPU サイクルがいずれにせよ必要ないのですぐに実行するか、スクリプトがメモリ不足になる前に実行するか、どちらが先に発生したとしてもです。

$whatever = null; を実行している場合。次に、変数のデータを書き換えています。メモリの解放/縮小が速くなる可能性がありますが、実際に必要なコードから CPU サイクルをより早く盗む可能性があり、全体的な実行時間が長くなります。

実際にはunset()、メモリのクリーニングに使用することはほとんどあり ません

変数に対して を実行するunset()と、変数が「ガベージ コレクション」としてマークされ、メモリがすぐに利用できなくなります。変数にはもうデータがありませんが、スタックは大きなサイズのままです。PHP >= 5.3.0 では、呼び出して GC パスを強制
できます。gc_collect_cycles()gc_enable()最初に行った後)。
ただし、PHP はスクリプト言語であり、Java ではないため、Java のように考えるべきではないことを理解しておく必要があります。スクリプトが非常に大量の RAM を使用するほど重い場合 - unset を使用でき、スクリプトがメモリを超えそうになると、GC がトリガーされ、unset 変数を含め、役に立たないものすべてがクリーンアップされます。しかし、ほとんどの場合、それを忘れることができます。
また、使用しないすべての変数の設定を解除したい場合は、使用しないでください。実際には、ほとんどの場合必要とされない空きメモリを確保するために、より多くの CPU サイクルを使用することで、スクリプトの実行時間が長くなります。もう変数を使用しないことを明示的に示す
ために使用すると言う人もいます。unset私はそれも悪い習慣だと思います。私にとっては、これらすべての役に立たない未設定でコードをより冗長にするだけです。

于 2013-05-15T05:23:51.923 に答える