gc_enable
è necessario solo se si chiama gc_disable
. Non c'è davvero alcuna ragione ragionevole per fare ciò, poiché ciò farebbe in modo che i riferimenti ciclici non vengano raccolti in modo garbage (come prima della 5.3, quando il GC ciclico non esisteva).
Il garbage collector di PHP funziona con il conteggio dei riferimenti. Puoi pensare a una variabile come "puntatore" a un oggetto. Quando un oggetto non ha indicazioni su di esso, è "morto" perché nulla può raggiungerlo, quindi è garbage collection.
//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;
considerare questo però:
$a = new Foo();
$b = new Bar();
$b->foo = $a;
$a->bar = $b;
$a = $b = null;
A questo punto nulla è aggrappata a $ a oppure $ b, tranne gli oggetti stessi. Questo è un riferimento ciclico e nelle versioni precedenti di php (< 5.3), non verrebbe raccolto. Il collettore ciclico in 5.3 può ora rilevarlo e ripulire questi oggetti.
Quindi quello che stai dicendo è che questo è attivo di default, e quindi non mi devo preoccupare di questo a meno che per qualche motivo abbandonato lo spegni con 'gc_disable'? – Stephen
@Stephen: Sì, esattamente. Non c'è onestamente alcun motivo per disattivare questa funzione. L'unico modo in cui i riferimenti ciclici possono essere raccolti è quando è acceso. – ryeguy
L'unico motivo per disattivare GC è garantire che le prestazioni dello script non siano influenzate dal GC attivato a livello euristico che impedirà l'elaborazione dello script. Tuttavia, se lo script fa scattare GC e GC viene disattivato, qualsiasi altro riferimento ciclico viene trapelato per sempre (o fino a quando il kernel del sistema operativo non uccide il processo). –