4 votes

Les objets de fermeture de PHP sont-ils éligibles à la collecte des déchets ?

Je me demandais si quelqu'un sait si les fonctions anonymes de PHP sont éligibles à la collecte des déchets ?

Je sais que les fonctions créées avec create_function ne sont pas collectées par les ordures, mais je n'ai pas pu trouver de référence sur celles créées avec l'option de récupération des données. function(){} (représenté en interne comme un objet Closure).

10voto

Sébastien Renauld Points 8624

Le ramasseur de déchets de PHP ne fait pas de distinction entre les types de "choses" - si elle a au moins une référence quelque part, elle est conservée. Dès que ce n'est pas le cas, la ressource est mise à la poubelle.

C'est no c'est la même chose que d'utiliser create_function En effet, PHP jette la référence de la fonction create_function dans la portée globale en plus de la référencer. Une fermeture (un objet Closure, si vous préférez, car c'est ce qu'ils sont !) n'existe que dans la portée dans laquelle elle a été créée + toutes celles auxquelles vous la passez.

Si vous voulez vous en convaincre, exécutez ce petit bout de code :

<?php
$r = memory_get_usage();
for ($i = 0; $i < 100; $i++) {
    $k = function() {echo "boo"; };
    if (memory_get_usage() > $r) {
            echo "Different memory count. Off by: ".(memory_get_usage() -$r);
    }
    $r = memory_get_usage();
}

Vous obtiendrez exactement un écho. Remplacez le $k avec create_function, et vous obtiendrez 100.

0voto

web2students.com Points 309

Vous pouvez voir par xdebug_debug_zval( 'a' ) ; si xdebug est installé. http://www.php.net/manual/en/features.gc.refcounting-basics.php

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X