Maison >développement back-end >PHP7 >Quelle est la différence entre les mécanismes de garbage collection de PHP5 et PHP7 ?
Les mécanismes de récupération de place de php5 et php7 utilisent tous deux le comptage de références. Puisque PHP est écrit en C, il existe ce qu'on appelle une structure en C. Nos variables PHP sont stockées de cette manière en C. Aujourd'hui, nous allons apprendre la différence entre les mécanismes de garbage collection de PHP5 et PHP7.
Les mécanismes de garbage collection de php5 et php7 utilisent tous deux le comptage de références
Voyons d'abord ce qu'est le comptage de références :
Puisque PHP est écrit en C, il existe ce qu'on appelle une structure en C. Ceci C'est ainsi que nos variables PHP sont stockées en C. Chaque variable PHP existe dans un conteneur appelé zval. Un conteneur zval, en plus de contenir le nom et la valeur de la variable, comprend également deux octets d'informations supplémentaires, l'un s'appelle 'is_ref'. qui est une valeur booléenne utilisée pour indiquer si cette variable appartient à la collection de référence. Grâce à cet octet, nous pouvons distinguer les variables ordinaires des variables de référence en PHP. Le deuxième octet supplémentaire est 'refcount', utilisé pour représenter le nombre de variables pointant vers. ce conteneur
Nous définissons une variable en PHP
$name='看看';
Nous pouvons maintenant utiliser la fonction xdebug_debug_zval() pour obtenir des informations pertinentes sur les variables au sein de la fonction
xdebug_debug_zval('name'); //输出 name:(refcount=1,is_ref=0)='new String' 现在我们把$name赋值给$money $money = $name;
Regardons à nouveau :
xdebug_debug_zval('name'); //输出 name:(refcount=2,is_ref=0)='new String'
À ce stade, nous verra que la valeur du champ refcount a augmenté de 1, ce qui signifie que les deux variables existantes pointent vers le même conteneur aval nommé name
Selon les règles de comptage de références, lorsque ce refcount=0, PHP recyclera ce conteneur comme poubelle.
De même, nous exécutons
unset($name); //一样也会把name容器的引用计数设置为0
Les conclusions ci-dessus concernent uniquement les types scalaires. Jetons un coup d'œil au
array responsable du type :
$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
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
Cela peut être vu. que pour les types de données complexes, les algorithmes de comptage de références de PHP5 et PHP7 sont différents
Essayons la situation des références circulaires
Basé sur le code ci-dessus, ajoutez une ligne de code
$person['hello'] = $person['name']
Sortie en PHP7 :
person: (refcount=1, is_ref=0) array (size=3) 'name' => (refcount=3, is_ref=0)string '看看' (length=6) 'age' => (refcount=0, is_ref=0)int 19 'hello' => (refcount=3, is_ref=0)string '看看' (length=6)
Sortie dans PHP5 :
person: (refcount=1, is_ref=0), array (size=3) 'name' => (refcount=2, is_ref=0),string '看看' (length=6) 'age' => (refcount=1, is_ref=0),int 19 'hello' => (refcount=2, is_ref=0),string '看看' (length=6)
Petit résumé :
Les mécanismes de récupération de place de PHP5 et PHP7 appartiennent tous deux au comptage de références, mais en termes de traitement algorithmique de types de données complexes :
Il existe une nouvelle implémentation de zval dans PHP7 Way. 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 d'être comptés ; *
* Il n'y aura plus deux décomptes ; Dans un objet, seul le décompte stocké dans l'objet lui-même est valide ; *
*Puisque le décompte est désormais stocké par la valeur elle-même, il peut être partagé avec des données dans des structures non-zval, comme entre zval et la clé de table de hachage ; *
Apprentissage recommandé :
Tutoriel vidéo PHPCe 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!