Heim > Backend-Entwicklung > PHP7 > Was ist der Unterschied zwischen den Garbage-Collection-Mechanismen von PHP5 und PHP7?

Was ist der Unterschied zwischen den Garbage-Collection-Mechanismen von PHP5 und PHP7?

醉折花枝作酒筹
Freigeben: 2023-02-18 06:58:01
nach vorne
1905 Leute haben es durchsucht

Die Garbage-Collection-Mechanismen von PHP5 und PHP7 verwenden beide die Referenzzählung. Da PHP in C geschrieben ist, gibt es in C eine sogenannte Struktur. Unsere PHP-Variablen werden auf diese Weise in C gespeichert. Heute lernen wir den Unterschied zwischen den Garbage-Collection-Mechanismen von PHP5 und PHP7 kennen.

Was ist der Unterschied zwischen den Garbage-Collection-Mechanismen von PHP5 und PHP7?

Die Garbage-Collection-Mechanismen von PHP5 und PHP7 verwenden beide die Referenzzählung

Werfen wir zunächst einen Blick darauf, was Referenzzählung ist:

Da PHP in C geschrieben ist, gibt es in C eine sogenannte Struktur. Dies So werden unsere PHP-Variablen 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, eines heißt „is_ref“. Dies ist ein boolescher Wert, der angibt, ob diese Variable zur Referenzsammlung gehört. Durch dieses Byte können wir gewöhnliche Variablen von Referenzvariablen in PHP unterscheiden. Das zweite zusätzliche Byte ist „refcount“, das die Anzahl der Variablen darstellt, auf die es verweist Dieser Container

Wir definieren eine Variable in PHP

$name='看看';
Nach dem Login kopieren

Wir können jetzt die Funktion xdebug_debug_zval() verwenden, um relevante Informationen über die Variablen innerhalb der Funktion zu erhalten

xdebug_debug_zval('name');
//输出 name:(refcount=1,is_ref=0)='new String'
现在我们把$name赋值给$money
$money = $name;
Nach dem Login kopieren

Lassen Sie uns noch einmal einen Blick darauf werfen:

xdebug_debug_zval('name');
//输出 name:(refcount=2,is_ref=0)='new String'
Nach dem Login kopieren

Dies Zu diesem Zeitpunkt haben wir Ich werde sehen, dass der Wert des Refcount-Felds um 1 gestiegen ist, was bedeutet, dass die beiden vorhandenen Variablen auf denselben Avail-Container mit dem Namen name verweisen.

Gemäß den Regeln der Referenzzählung wird PHP diesen Container recyceln, wenn dieser Refcount = 0 ist als Müll.

Ähnlich führen wir

unset($name); //一样也会把name容器的引用计数设置为0
Nach dem Login kopieren

aus. Die obigen Schlussfolgerungen gelten nur für Skalartypen:

$person=['name'=>'请欢','age'=>19];
var_dump(xdebug_debug_zval('person'));
在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
Nach dem Login kopieren

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
Nach dem Login kopieren

Es ​​ist zu sehen dass für komplexe Datentypen die Referenzzählalgorithmen von PHP5 und PHP7 unterschiedlich sind.

Lassen Sie uns die Situation von Zirkelverweisen ausprobieren PHP5:

$person['hello'] = $person['name']
Nach dem Login kopieren
Kleine Zusammenfassung:

Die Garbage-Collection-Mechanismen von PHP5 und PHP7 gehören beide zur Referenzzählung, aber im Hinblick auf die Algorithmusverarbeitung komplexer Datentypen:

Es gibt eine neue Implementierung von zval in PHP7 Way. 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: *

* Einfache Datentypen müssen keinen Speicher separat zuweisen und müssen nicht gezählt werden. *

* Es gibt keine zwei Zählungen mehr. In einem Objekt ist nur die im Objekt selbst gespeicherte Anzahl gültig; *

*Da die Anzahl jetzt vom Wert selbst gespeichert wird, kann sie mit Daten in Nicht-Zval-Strukturen geteilt werden, z. B. zwischen Zval und Hashtabellenschlüssel; *

Empfohlenes Lernen:

php-Video-Tutorial

Das obige ist der detaillierte Inhalt vonWas ist der Unterschied zwischen den Garbage-Collection-Mechanismen von PHP5 und PHP7?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:csdn.net
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage