Maison  >  Article  >  développement back-end  >  Introduction au mécanisme de récupération de place PHP (exemple de code)

Introduction au mécanisme de récupération de place PHP (exemple de code)

不言
不言avant
2019-01-23 09:59:552217parcourir

Cet article vous présente le mécanisme de récupération de place PHP (exemples de code). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

Le mécanisme de récupération de place de PHP peut être simplement résumé comme le mécanisme COW de comptage de références, de copie sur écriture

Cet article partage principalement avec vous les connaissances sur la maîtrise du mécanisme de récupération de place de PHP. J'espère que cela pourra aider tout le monde.

Connaissance de base du comptage de références

La réponse du site officiel est la suivante Chaque variable PHP a une valeur appelée "zval" "Un conteneur de variable zval, en plus du type et de la valeur de la variable, il comprend également deux octets d'informations supplémentaires is_ref et refcount is_ref est un valeur booléenne, utilisée pour identifier si cette variable appartient à l'ensemble de référence. Grâce à cet octet, le moteur PHP peut distinguer les variables ordinaires des variables de référence refcount est utilisé pour représenter le nombre de variables pointant vers ce conteneur de variables zval Nombre de références en PHP5 En PHP5, la mémoire zval est allouée séparément du tas (à quelques exceptions près), et PHP a besoin de savoir quels zvals sont utilisés et lesquels doivent être publiés. Cela nécessite donc l'utilisation du comptage de références : la valeur de refcount__gc dans zval est utilisée pour enregistrer le nombre de fois que zval lui-même a été référencé. Par exemple, dans l'instruction b = 12, 12 est référencé par deux. variables, donc son nombre de références est 2. Si le compteur de référence devient 0, cela signifie que la variable n'est plus utilisée et que la mémoire peut être libérée.

est la suivante :

<?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

Chaque variable se souvient de son propre numérozval en PHP7Zval a une nouvelle implémentation en PHP7. Le changement le plus fondamental est que la mémoire requise par zval n'est plus allouée séparément du tas et que le décompte de références n'est plus stocké par lui-même. Le nombre de références des types de données complexes (tels que les chaînes, les tableaux et les objets) est stocké par lui-même. Cette implémentation présente les avantages suivants : Les types de données simples n'ont pas besoin d'allouer de la mémoire séparément, et n'ont pas besoin de compter Il n'y aura plus deux comptes dans l'objet. uniquement l'objet lui-même Le décompte stocké est valide Puisque le décompte est désormais stocké par la valeur elle-même, il peut être partagé avec des données de structure non-zval, telles que le pointeur requis pour un accès indirect entre zval et la clé de table de hachage Le nombre a diminué

<?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 Les variables ne se souviennent plus de leurs propres numéros. Les types complexes tels que les tableaux se souviennent de leurs propres numéros Qu'est-ce que les déchetsUniquement selon la directive 3, le GC collectera zval puis transmettra le nouvel algorithme pour déterminer. si ce zval est une poubelle. Alors, comment juger si une telle variable est de véritables déchets ? Pour faire simple, le refcount est réduit de 1 pour chaque élément du zval Une fois l'opération terminée, si le refcount du zval=0, alors le zval est une poubelle . Si Si le refcount d'un zval augmente, alors le zval est toujours utilisé et n'est pas une poubelle Si le refcount d'un zval diminue à 0, alors le zval peut être libéré et n'est pas une poubelle Si un zval Après le refcount est réduit et est supérieur à 0, alors ce zval ne peut pas être libéré, et ce zval peut devenir un déchet

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer