Heim  >  Artikel  >  Backend-Entwicklung  >  Einführung in den PHP-Garbage-Collection-Mechanismus (Codebeispiel)

Einführung in den PHP-Garbage-Collection-Mechanismus (Codebeispiel)

不言
不言nach vorne
2019-01-23 09:59:552216Durchsuche

Dieser Artikel bietet Ihnen eine Einführung in den PHP-Garbage-Collection-Mechanismus (Codebeispiele). Ich hoffe, er wird Ihnen als Referenz dienen.

Der Garbage-Collection-Mechanismus von PHP kann einfach als COW-Mechanismus mit Referenzzählung beim Kopieren zusammengefasst werden.

Dieser Artikel vermittelt Ihnen hauptsächlich das Wissen über die Beherrschung des PHP-Garbage-Collection-Mechanismus. Ich hoffe, es kann allen helfen.

Grundkenntnisse der Referenzzählung

Die Antwort auf der offiziellen Website lautet wie folgt Jede PHP-Variable hat einen Wert namens "zval" > is_ref ist ein boolescher 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 refcount wird verwendet, um die Anzahl der Variablen darzustellen, die auf diesen zval-Variablencontainer verweisen Referenzanzahl in PHP5 In PHP5 wird der ZVAL-Speicher (mit wenigen Ausnahmen) getrennt vom Heap zugewiesen, und PHP muss wissen, welche ZVALs verwendet werden und welche freigegeben werden müssen. Dies erfordert also die Verwendung der Referenzzählung: Der Wert von refcount__gc in zval wird verwendet, um die Häufigkeit zu speichern, mit der zval selbst referenziert wurde. In der Anweisung b = 12 wird beispielsweise 12 durch zwei referenziert Variablen, daher beträgt die Referenzanzahl 2. Wenn der Referenzzähler 0 wird, bedeutet dies, dass die Variable nicht mehr verwendet wird und der Speicher freigegeben werden kann.

lautet wie folgt:

<?php 
//php zval变量容器
$a = 1;
$b = 1;
$c = &$a;
$d = $b;
$e = range(0, 3); 
xdebug_debug_zval(&#39;a&#39;);
 xdebug_debug_zval(&#39;b&#39;); 
xdebug_debug_zval(&#39;c&#39;);
 xdebug_debug_zval(&#39;d&#39;);
 xdebug_debug_zval(&#39;e&#39;); >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 结果如下 
a:(refcount=2, is_ref=1),int 1b:(refcount=2, is_ref=0),int 1c:(refcount=2, is_ref=1),int 1d:(refcount=2, is_ref=0),int 1e:(refcount=1, is_ref=0), array (size=4) 0 => (refcount=1, is_ref=0),int 0 1 => (refcount=1, is_ref=0),int 1 2 => (refcount=1, is_ref=0),int 2 3 => (refcount=1, is_ref=0),int 3

Jede Variable zeichnet ihre eigene Nummer auf

zval in PHP7Zval 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: Einfache Datentypen müssen keinen Speicher separat zuweisen und müssen nicht zählen. Es gibt keine zwei Zählungen mehr im Objekt nur das Objekt selbst. Der gespeicherte Zählerstand ist gültig Da der Zählerstand nun durch den Wert selbst gespeichert wird, kann er mit Nicht-zval-Strukturdaten geteilt werden, wie etwa dem Zeiger, der für den indirekten Zugriff zwischen zval und dem Hashtabellenschlüssel erforderlich ist Die Zahl ist gesunken

<?php 
//php zval变量容器$a = 1;$b = 1;$c = &$a;$d = $b;$e = range(0, 3); 
xdebug_debug_zval(&#39;a&#39;);
 xdebug_debug_zval(&#39;b&#39;); 
xdebug_debug_zval(&#39;c&#39;);
 xdebug_debug_zval(&#39;d&#39;); 
xdebug_debug_zval(&#39;e&#39;); >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 结果如下 a:(refcount=2, is_ref=1)int 1b:(refcount=0, is_ref=0)int 1c:(refcount=2, is_ref=1)int 1d:(refcount=0, is_ref=0)int 1e:(refcount=1, is_ref=0)array (size=4) 0 => (refcount=0, is_ref=0)int 0 1 => (refcount=0, is_ref=0)int 1 2 => (refcount=0, is_ref=0)int 2 3 => (refcount=0, is_ref=0)int 3

Normal Variablen erinnern sich nicht mehr an ihre eigenen Zahlen. Was ist Müll?Nur ​​unter Richtlinie 3 sammelt der GC Zval und übergibt dann den neuen Algorithmus zur Bestimmung ob dieser Zval Müll ist. Wie kann man also beurteilen, ob eine solche Variable echter Müll ist? Einfach ausgedrückt wird der Refcount für jedes Element im zval um 1 reduziert. Wenn der Refcount des zval = 0 ist, ist der zval nach Abschluss der Operation Müll Wenn der Refcount eines zval steigt, dann wird der zval immer noch verwendet und ist kein Müll Wenn der refcount eines zval auf 0 sinkt, kann der zval freigegeben werden und ist kein Müll Wenn ein Zval nach dem Refcount reduziert wird und größer als 0 ist, kann dieser Zval nicht freigegeben werden und dieser Zval kann zu Müll werden

Das obige ist der detaillierte Inhalt vonEinführung in den PHP-Garbage-Collection-Mechanismus (Codebeispiel). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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