Maison  >  Article  >  développement back-end  >  Comment libérer de la mémoire récursive en php

Comment libérer de la mémoire récursive en php

(*-*)浩
(*-*)浩original
2019-10-16 14:38:302181parcourir

Comment libérer de la mémoire récursive en php

S'il y a des références récursives à des objets PHP, une fuite de mémoire se produira. Ce bug existe en PHP depuis longtemps. Reproduisons d'abord ce bug. Le code est le suivant :

<?php
class Foo {
    function __construct() {
        $this->bar = new Bar($this);
    }
}
 
class Bar {
    function __construct($foo) {
        $this->foo = $foo;
    }
}
 
for ($i = 0; $i < 100; $i++) {
    $obj = new Foo();
 
    unset($obj);
 
    echo memory_get_usage(), "
";
}
?>

Exécutez le code ci-dessus, vous constaterez que l'utilisation de la mémoire ne devrait pas changer, mais en fait. Mais elle ne cesse d’augmenter et la désactivation n’est pas pleinement efficace.

Une grande partie du développement actuel est basée sur des frameworks. Il existe des relations d'objet complexes dans l'application, vous êtes donc susceptible de rencontrer de tels problèmes. Voyons quelles solutions peuvent être mises en œuvre :

<?php
class Foo {
    function __construct() {
        $this->bar = new Bar($this);
    }
 
    function __destruct() {
        unset($this->bar);
    }
}
 
class Bar {
    function __construct($foo) {
        $this->foo = $foo;
    }
}
 
for ($i = 0; $i < 100; $i++) {
    $obj = new Foo();
 
    $obj->__destruct();
 
    unset($obj);
 
    echo memory_get_usage(), "
";
}
?>
<.>Heureusement, ce bug a été corrigé dans le code CVS de PHP5.3.

Conditions de fin de récursion, il existe généralement plusieurs façons :

1 Ajoutez le paramètre de profondeur de récursion aux paramètres de la fonction récursive

Profondeur de. chaque appel en ajoute un, ajoute une instruction conditionnelle dans le corps de la fonction et force un retour lorsque la profondeur dépasse une certaine valeur

2 Introduisez la structure de la pile d'éléments et du contenu qui doit être enregistré dans chacun ; la récursivité est généralement poussée dans la pile, apparaît le cas échéant

Dans le corps de la fonction, ajoutez des instructions conditionnelles pour déterminer la taille de la pile ou les éléments de la pile, et revenez lorsque les conditions sont remplies

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn