¿Para qué sirve la función gc_collect_cycles?

¿Puede alguien explicar por qué circunstancias la función de gc_collect_cycles puede ser útil? ¿Debería llamarse antes de que esté a punto de llevarse a cabo una importante utilización de la memoria?

PHP tiene habilitado “Garbage Collector” por defecto. Se usa para liberar memoria utilizada por “basura”. gc_collect_cycles() fuerza la recolección de cualquier ciclo de basura existente. Devuelve el número de ciclos recogidos (liberados) (objetos, valores variables …). Habilitado Garbage Collector llama a esta función internamente de vez en cuando para liberar recursos. En la mayoría de los casos, el script PHP vive muy poco tiempo. En este caso, toda la basura se destruirá al final del trabajo sin ninguna recolección de basura.

Algunas veces es necesario administrar GC manualmente:

  1. gc_disable() puede acelerar algunas operaciones largas, pero también da como resultado algunos gastos generales de memoria.
  2. gc_collect_cycles() podría usarse para especificar los momentos correctos de GC.

Otra razón para usar gc_collect_cycles() – depuración. Supongamos que quiere saber cuál es el consumo de memoria de algún bloque de código con memory_get_usage() . Primero debe deshabilitar la GC, en cualquier otro lugar obtendrá resultados incorrectos. Después de eso, desea separar el tiempo consumido por GC y por su aplicación. Así que llame a gc_collect_cycles() y mida las temporizaciones / memoria antes y después.

Pequeño ejemplo:

 class A { public $ref; public $name; public function __construct($name) { $this->name = $name; echo($this->name.'->__construct();'.PHP_EOL); } public function __destruct() { echo($this->name.'->__destruct();'.PHP_EOL); } } gc_disable(); $a1 = new A('$a1'); $a2 = new A('$a2'); $a1->ref = $a2; $a2->ref = $a1; $b = new A('$b'); $b->ref = $a1; echo('$a1 = $a2 = $b = NULL;'.PHP_EOL); $a1 = $a2 = $b = NULL; echo('gc_collect_cycles();'.PHP_EOL); echo('// removed cycles: '.gc_collect_cycles().PHP_EOL); echo('exit();'.PHP_EOL); 

Se producirá:

 $a1->__construct(); $a2->__construct(); $b->__construct(); $a1 = $a2 => $b = NULL; $b->__destruct(); gc_collect_cycles(); $a2->__destruct(); $a1->__destruct(); // removed cycles: 4 

Esto significa que solo $b se destruyó cuando se le preguntó. Otros $a1 y $a2 tienen referencias cíclicas, y sus propiedades de name también consumen memoria. Dos objetos + dos cadenas = 4 (eliminado por gc_collect_cycles() ) .