gc_enable
は、gc_disable
に電話する場合にのみ必要です。実際にはこれを行う理由はまったくありません。循環参照がガベージコレクションされないようにするためです(サイクリックGCが存在しなかった5.3より前)。
PHPのガベージコレクタは参照カウントで動作します。変数はオブジェクトの「ポインタ」と考えることができます。オブジェクトにポインタがない場合は、何も到達できないため「死んでいる」ため、ガベージコレクションされます。
//one thing points to the Foo object
$a = new Foo();
//now two things do
$b = $a;
//now only $b points to it
$a = null;
//now nothing points to Foo, so php garbage collects the object
$b = null;
このしかし考えてみましょう:
$a = new Foo();
$b = new Bar();
$b->foo = $a;
$a->bar = $b;
$a = $b = null;
この時点では何もオブジェクト自体を除いて$ bのAまたは$へ保持されません。これは循環参照で、以前のバージョンのPHP(< 5.3)では収集されませんでした。 5.3の周期的コレクタはこれを検出し、これらのオブジェクトをクリーンアップすることができます。
あなたが言っているのは、デフォルトでオンになっているから、残念ながらgc_disableでそれをオフにしない限り、心配する必要はありません。 – Stephen
@Stephen:そうです。正直なところ、この機能を無効にする理由はありません。循環参照が収集できる唯一の方法は、それがオンの場合です。 – ryeguy
GCをオフにする唯一の理由は、スクリプトの処理に先立ってヒューリスティックにトリガされたGCによってスクリプトのパフォーマンスが影響を受けないことを保証することです。しかし、スクリプトがGCを起動してGCがオフになると、それ以上の循環参照は永久に(またはOSカーネルがプロセスを終了させるまで)リークされます。 –