Der Inhalt dieses Artikels befasst sich mit der Analyse von Referenzen und der Speicherbereinigung in PHP. Ich hoffe, dass er für Freunde hilfreich ist.
Jede PHP-Variable wird in einem Variablencontainer namens „zval“ gespeichert. Ein zval-Variablencontainer enthält zusätzlich zum Typ und Wert der Variablen zwei Bytes zusätzlicher Informationen. Der erste ist „is_ref“, ein Bool-Wert, der verwendet wird, um zu identifizieren, ob diese Variable zum Referenzsatz gehört. Durch dieses Byte kann die PHP-Engine gewöhnliche Variablen von Referenzvariablen unterscheiden. Da PHP Benutzern die Verwendung benutzerdefinierter Referenzen durch die Verwendung von & ermöglicht, gibt es im zval-Variablencontainer auch einen internen Referenzzählmechanismus, um die Speichernutzung zu optimieren. Das zweite zusätzliche Byte ist „refcount“, das verwendet wird, um die Anzahl der Variablen (auch Symbole genannt) anzugeben, die auf diesen zval-Variablencontainer verweisen. Alle Symbole existieren in einer Symboltabelle, wobei jedes Symbol einen Gültigkeitsbereich (Scope) hat, das Hauptskript (z. B. das über den Browser angeforderte Skript) und jede Funktion oder Methode ebenfalls einen Gültigkeitsbereich haben.
//Objekte in PHP werden als Referenz übergeben
is_ref = 0, refcount = 0 zval-Container wird am Ende der Skriptausführung zerstört
Zitat des offiziellen Beispiels
<?php $a = array( 'one' ); $a[] =& $a; xdebug_debug_zval( 'a' );
a: (refcount=2, is_ref=1)=array ( 0 => (refcount=1, is_ref=0)='one', 1 => (refcount=2, is_ref=1)=... )
Durch die Ausführung von unset$a wird die Speicherzuordnung zwischen der Variablen und zval freigegeben, die geschlossene Schleife selbst existiert jedoch weiterhin
(refcount=1, is_ref=1)=array ( 0 => (refcount=1, is_ref=0)='one', 1 => (refcount=1, is_ref=1)=... )
Aber zu diesem Zeitpunkt können keine Variablen in den ZVAL-Container manipuliert werden. Zu diesem Zeitpunkt ist er zu Speichermüll geworden und kann nicht freigegeben werden Recycling-Mechanismus: Vereinfacht ausgedrückt werden nach der Ausführung des Skripts alle vorhandenen Variablen refcount -1 für die Gesamtdaten, wenn sie auf 0 reduziert werden, werden sie als Müll beurteilt und der Speichercontainer wird zerstört
Verwandte Empfehlungen:
Welche Art von Müll kann durch den Garbage Collection-Mechanismus von PHP recycelt werden? PHP-Garbage-Collection-Mechanismus – Grundkenntnisse der ReferenzzählungDas obige ist der detaillierte Inhalt vonAnalyse von Referenzen und Garbage Collection in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!