Heim  >  Artikel  >  Backend-Entwicklung  >  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?

醉折花枝作酒筹
醉折花枝作酒筹nach vorne
2021-07-02 09:13:251852Durchsuche

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='看看';

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;

Lassen Sie uns noch einmal einen Blick darauf werfen:

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

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

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

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 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']

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen