Heim  >  Artikel  >  Backend-Entwicklung  >  So geben Sie rekursiven Speicher in PHP frei

So geben Sie rekursiven Speicher in PHP frei

(*-*)浩
(*-*)浩Original
2019-10-16 14:38:302183Durchsuche

So geben Sie rekursiven Speicher in PHP frei

Bei rekursiven Verweisen auf PHP-Objekte kommt es zu einem Speicherverlust. Dieser Fehler besteht seit langem in PHP. Der Code lautet wie folgt:

<?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(), "
";
}
?>

Führen Sie den obigen Code aus. Sie werden feststellen, dass sich die Speichernutzung nicht ändern sollte Aber es nimmt immer weiter zu und eine unwirksame Wirkung ist nicht voll wirksam.

Viele aktuelle Entwicklungen basieren auf Frameworks. Es gibt komplexe Objektbeziehungen in der Anwendung, daher ist es wahrscheinlich, dass Sie auf solche Probleme stoßen:

<?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(), "
";
}
?>

Glücklicherweise wurde dieser Fehler im CVS-Code von PHP5.3 behoben.

Rekursionsbeendigungsbedingungen, im Allgemeinen gibt es viele Möglichkeiten:

1 Fügen Sie den Rekursionstiefenparameter zu den Parametern der rekursiven Funktion hinzu

Tiefe von Fügen Sie bei jedem Aufruf eine bedingte Anweisung zum Funktionskörper hinzu und erzwingen Sie eine Rückgabe, wenn die Tiefe einen bestimmten Wert überschreitet.

2 Führen Sie die Elementstapelstruktur und einige Inhalte ein, die in jedem aufgezeichnet werden müssen Die Rekursion wird normalerweise in den Stapel verschoben und bei Bedarf angezeigt

Fügen Sie im Funktionskörper bedingte Anweisungen hinzu, um die Stapelgröße oder Stapelelemente zu bestimmen, und kehren Sie zurück, wenn die Bedingungen erfüllt sind

Das obige ist der detaillierte Inhalt vonSo geben Sie rekursiven Speicher in PHP frei. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:Wozu dienen PHP-Pfeile?Nächster Artikel:Wozu dienen PHP-Pfeile?