Heim > Artikel > Backend-Entwicklung > Was ist der Unterschied zwischen PHP7 Garbage Collection und PHP5?
Die Garbage-Collection-Mechanismen von PHP5 und PHP7 verwenden beide die Referenzzählung.
Was ist Referenzzählung?
Da PHP in C geschrieben ist, gibt es in C so etwas wie eine Struktur. Unsere PHP-Variablen werden auf diese Weise in C gespeichert.
Jede PHP-Variable existiert in einem Container namens zval. Ein zval-Container enthält zusätzlich zum Variablennamen und -wert auch zwei Bytes mit zusätzlichen Informationen. Ein Byte heißt „is_ref“, ein boolescher Wert. , wird verwendet, um anzugeben, ob diese Variable zu einem Referenzsatz gehört. Mithilfe dieses Bytes können wir normale Variablen von Referenzvariablen unterscheiden. Das zweite zusätzliche Byte ist „refcount“, das verwendet wird, um die Anzahl der Variablen anzugeben, die auf diesen Container verweisen. Nummer.
Ausgabe in PHP5:
person: (refcount=1, is_ref=0), array (size=2) 'name' => (refcount=1, is_ref=0),string '看看' (length=6) 'age' => (refcount=1, is_ref=0),int 19
Ausgabe in PHP7:
person: (refcount=2, is_ref=0) array (size=2) 'name' => (refcount=1, is_ref=0)string '看看' (length=6) 'age' => (refcount=0, is_ref=0)int 19
Es ist ersichtlich, dass für komplexe Datentypen , Die Referenzzählalgorithmen von PHP5 und PHP7 sind unterschiedlich.
Versuchen wir es mit der Zirkelverweissituation:
Fügen Sie basierend auf dem obigen Code eine Codezeile hinzu
$person['hello'] = $person['name']
Ausgabe in PHP7:
person: (refcount=1, is_ref=0) array (size=3) 'name' => (refcount=3, is_ref=0)string '看看' (length=6) 'age' => (refcount=0, is_ref=0)int 19 'hello' => (refcount=3, is_ref=0)string '看看' (length=6)
Ausgabe in PHP5:
person: (refcount=1, is_ref=0), array (size=3) 'name' => (refcount=2, is_ref=0),string '看看' (length=6) 'age' => (refcount=1, is_ref=0),int 19 'hello' => (refcount=2, is_ref=0),string '看看' (length=6)
Zusammenfassung:
Die Garbage-Collection-Mechanismen von PHP5 und PHP7 gehören beide zur Referenzzählung im Hinblick auf die Algorithmenverarbeitung komplexer Datentypen: zval hat eine neue Implementierung in PHP7. Die grundlegendste Änderung besteht darin, dass der von *zval benötigte Speicher nicht mehr getrennt vom Heap zugewiesen wird und der Referenzzähler nicht mehr allein gespeichert wird. Der Referenzzähler komplexer Datentypen (z. B. Zeichenfolgen, Arrays und Objekte) wird einzeln gespeichert.
Diese Implementierung hat die folgenden Vorteile:
1. Einfache Datentypen müssen keinen Speicher separat zuweisen und müssen nicht gezählt werden; 2. Es wird keine Doppelzählung mehr geben. In einem Objekt ist nur die im Objekt selbst gespeicherte Anzahl gültig.
3 Da die Anzahl jetzt vom Wert selbst gespeichert wird, kann sie mit Daten in Nicht-Zval-Strukturen geteilt werden, z. B. zwischen Zval und Hashtable-Schlüssel.
Empfohlenes Tutorial:
PHP7-TutorialDas obige ist der detaillierte Inhalt vonWas ist der Unterschied zwischen PHP7 Garbage Collection und PHP5?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!