2011-01-17 22 views
12

Prima mi dici di leggere il manuale, controllare le php.net documentation for this function:Cosa fa esattamente la funzione gc_enable di PHP?

Attenzione
Questa funzione non è documentata; solo la sua lista di argomenti è disponibile.

Questo è stato utile!

This page spiega che abilita la garbage collection per i riferimenti ciclici. Dove e quando è utile? Qualcuno potrebbe mostrarmi un esempio del suo utilizzo? Preferibilmente un esempio in cui un riferimento ciclico viene creato e quindi raccolto.

risposta

14

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.

+0

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

+0

@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

+0

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). –

8

V'è una completa chapter on Garbage Collection in the PHP Manual spiegare questo:

Di solito cerco di non collegare solo fuori sede, ma sento che è troppo da riassumere.

+1

Eccellente ...Questo dovrebbe essere collegato alla documentazione della funzione a cui ho fatto riferimento. – Stephen

+0

@Stephen c'è anche la (breve) descrizione di [zend.enable_gc] (http://us3.php.net/manual/en/info.configuration.php#ini.zend.enable-gc) in [ini section] (http://us3.php.net/manual/en/ini.list.php) che lo elenca come abilitato di default. – Gordon

1

Ci sono motivi per cui utilizziamo gc_disable e gc_enable.

Nell'ultimo manuale di PHP, essa afferma

Può essere molto utile per i grandi progetti, quando si crea un sacco di oggetti che devono rimanere nella memoria. Quindi GC non può ripulirli e sprecare tempo in CPU.

Problema nel compositore: https://github.com/composer/composer/pull/3482#issuecomment-65199153

Solution e la gente risponde: https://github.com/composer/composer/commit/ac676f47f7bbc619678a29deae097b6b0710b799

Si ricorda che il secondo link qui sopra contiene un sacco di commenti con grafica.

+0

Queste risposte sono semplicemente fantastiche. –

Problemi correlati