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!