Maison > Article > développement back-end > Introduction au mécanisme de récupération de place PHP (gc)
Principe de compilation PHP :
ze (moteur zend) appelle l'analyseur lexical pour supprimer les espaces du code PHP, le diviser en jetons après les commentaires, et ze appelle la syntaxe analyse Le processeur traite ensuite le jeton pour former un opcode, qui existe sous la forme d'un tableau d'opérations, et exécute enfin un tableau d'opérations pour afficher le résultat.
Lorsqu'un thread PHP se termine, tout l'espace mémoire actuellement occupé sera détruit. Alors si ce fil ne se termine pas, comment récupérer la mémoire ?
refcount : Technologie de référence, qui peut être comprise comme le nombre de pointeurs pointant vers le conteneur.
is_ref : Qu'il soit référencé (ne peut être que 0 ou 1)
Processus d'affectation :
<?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
Processus de référence :
<?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
Et s'il y en a plus Si vous supprimez une référence, is_ref sera-t-il mis à zéro ? Alors un bug n'apparaîtra-t-il pas ? Les conteneurs variables sont toujours des références. Alors jetons un coup d'oeil :
<?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)
peut-il désactiver et attribuer la valeur null aux deux variables de recyclage ? Beaucoup de gens croient à tort que ces deux éléments peuvent recycler l'espace variable. En fait, ils se trompent et ne font que réduire l'espace occupé par les variables. Du point de vue du recyclage, le conteneur existe toujours.
<?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
Recommandé : Tutoriel vidéo PHP
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!