Maison > Article > développement back-end > Quelle est la différence entre le garbage collection php7 et php5
Les mécanismes de garbage collection de php5 et php7 utilisent tous deux le comptage de références.
Qu'est-ce que 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.
Chaque variable PHP existe dans un conteneur appelé zval. Un conteneur zval, en plus du nom et de la valeur de la variable, comprend également deux octets d'informations supplémentaires. L'un est appelé 'is_ref', qui est une valeur booléenne. , utilisé pour indiquer si cette variable appartient à un ensemble de référence. Grâce à cet octet, nous pouvons PHP distinguer les variables ordinaires des variables de référence. Le deuxième octet supplémentaire est 'refcount', qui est utilisé pour indiquer le nombre de variables pointant vers ce conteneur. nombre.
Sortie en 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
Sortie en PHP7 :
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
On peut voir 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 de référence circulaire :
Sur la base du 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 en 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)
Résumé :
Les mécanismes de récupération de place de PHP5 et PHP7 appartiennent tous deux au comptage de références. en termes de traitement algorithmique de types de données complexes : zval 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 :
1. 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
. 2. Il n’y aura plus de double comptage. Dans un objet, seul le nombre stocké dans l'objet lui-même est valide ;
3 Puisque le nombre est désormais stocké par la valeur elle-même, il peut être partagé avec des données dans des structures non-zval, par exemple entre zval. et clé de table de hachage.
Tutoriel recommandé : Tutoriel PHP7
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!