Maison > développement back-end > PHP7 > Quelle est la différence entre le garbage collection php7 et php5

Quelle est la différence entre le garbage collection php7 et php5

王林
Libérer: 2023-02-17 12:50:01
original
3424 Les gens l'ont consulté

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
Copier après la connexion

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
Copier après la connexion

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']
Copier après la connexion

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)
Copier après la connexion

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)
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal