PHP-Kompilierungsprinzip:
ze (Zend-Engine) ruft den lexikalischen Analysator auf, um Leerzeichen aus dem PHP-Code zu entfernen, ihn nach Kommentaren in Token aufzuteilen und ze ruft die Syntax auf Analyse Der Prozessor verarbeitet dann das Token, um einen Opcode zu bilden, der in Form eines Op-Arrays vorliegt, und führt schließlich das Op-Array aus, um das Ergebnis auszugeben.
Wenn ein PHP-Thread endet, wird der gesamte aktuell belegte Speicherplatz zerstört. Wenn dieser Thread also nicht endet, wie kann man dann den Speicher zurückgewinnen?
refcount: Referenztechnologie, die als Anzahl der Zeiger verstanden werden kann, die auf den Container zeigen.
is_ref: Ob referenziert wird (kann nur 0 oder 1 sein)
Zuweisungsprozess:
<?php $a = 'aa'; xdebug_debug_zval(a); //(refcount=1, is_ref=0),string 'aa' (length=6) $b = $a; //以下的两个其实是一个变量容器 xdebug_debug_zval(a); //(refcount=2, is_ref=0),string 'aa' (length=6) xdebug_debug_zval(b); //(refcount=2, is_ref=0),string 'aa' (length=6) unset($b); //对变量容器 refcount 减1xdebug_debug_zval(a); //(refcount=1, is_ref=0),string 'aa' (length=6) xdebug_debug_zval(b); //b: no such symbol b变量被销毁,指向被断掉,如果对应容器的引用技术为零,那么该块儿内存被回收 $b = $a; $b = 'bb'; xdebug_debug_zval(a); //(refcount=1, is_ref=0),string 'aa' (length=6) xdebug_debug_zval(b); //(refcount=1, is_ref=0),string 'aa' (length=6) 重新申请一个变量容器存储b,a的变量容器引用减1
Referenzprozess:
<?php $a = 'aa'; xdebug_debug_zval('a'); //(refcount=1, is_ref=0),string 'aa' (length=2) $b = & $a;//变量容器的引用技术加1,引用标记置为1xdebug_debug_zval('a'); //(refcount=2, is_ref=1),string 'aa' (length=2) xdebug_debug_zval('b'); //(refcount=2, is_ref=1),string 'aa' (length=2) $b = '123'; //php会发现,该容器变量是引用(is_ref),所以容器变量不用像赋值那样再申请一个 xdebug_debug_zval('a'); //(refcount=2, is_ref=1),string '123' (length=2) xdebug_debug_zval('b'); //(refcount=2, is_ref=1),string '123' (length=2) unset($b);//变量容器应用计数减1,引用为零 xdebug_debug_zval('a'); //(refcount=1, is_ref=0),string '123' (length=2) xdebug_debug_zval('b'); // b: no such symbol
Was ist, wenn es welche gibt? Wenn Sie eine Referenz deaktivieren, wird is_ref dann auf Null gesetzt? Tritt dann kein Fehler auf? Variablencontainer sind weiterhin Referenzen. Werfen wir also einen Blick darauf: Können beide Recycling-Variablen
<?php $a = 'aa'; $b = &$a; $c = &$a;//可以看到引用refCount是3,is_ref永远是1xdebug_debug_zval('a'); //(refcount=3, is_ref=1),string 'aa' (length=2) xdebug_debug_zval('b'); //(refcount=3, is_ref=1),string 'aa' (length=2) xdebug_debug_zval('c'); //(refcount=3, is_ref=1),string 'aa' (length=2) unset($b);//我们期待的bug没有出现,只是refcount减1,is_ref还是1xdebug_debug_zval('a'); //(refcount=2, is_ref=1),string 'aa' (length=2) xdebug_debug_zval('b'); // b: no such symbol xdebug_debug_zval('c'); //(refcount=2, is_ref=1),string 'aa' (length=2) //那php它怎么知道这个容器还有引用,毕竟is_ref仍然是1,不能计数,那么现在refcount就起作用了,是它告诉php,该变量有几个引用,但问题又来了,如果我干点坏事,在引用的时候,又赋值,它会不会有bug $e = $a;//我们看到期望的bug还是没出现,这时候再赋值,就不像直接赋值那么简单refcount加1了,而是申请了一个新的变量容器 xdebug_debug_zval('a'); //(refcount=2, is_ref=1),string 'aa' (length=2) xdebug_debug_zval('e'); //(refcount=1, is_ref=0),string 'aa' (length=2)
deaktiviert und null zugewiesen werden? Viele Menschen glauben fälschlicherweise, dass diese beiden Variablen den Speicherplatz wiederverwenden können. Aus der Sicht des Recyclings ist der Container jedoch immer noch vorhanden.
<?php $a = 'aa'; $b = $a; $b = null; //又申请了一个变量容器 xdebug_debug_zval('a'); //(refcount=1, is_ref=0),string 'aa' (length=2) xdebug_debug_zval('b'); //(refcount=1, is_ref=0),null 变量空间并没被回收 unset($b); //这时候才释放了b变量容器的空间 xdebug_debug_zval('a'); //(refcount=1, is_ref=0),string 'aa' (length=2) xdebug_debug_zval('b'); //b: no such symbol
Empfohlen: PHP-Video-Tutorial
Das obige ist der detaillierte Inhalt vonEinführung in den PHP-Garbage-Collection-Mechanismus (gc). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!