Maison  >  Article  >  développement back-end  >  Explication détaillée de référence du noyau PHP7

Explication détaillée de référence du noyau PHP7

Guanhui
Guanhuiavant
2020-06-06 09:20:232616parcourir

Explication détaillée de référence du noyau PHP7

Problème

La référence (REFERENCE) était un indicateur en PHP5, mais après PHP7, nous l'avons transformé en un nouveau type : IS_REFERNCE. Les références sont une application très courante, donc ce changement a apporté beaucoup de changements, et cela nous a également fait oublier accidentellement de gérer ce type lors du développement de PHP7, ce qui a causé de nombreux bugs.

Le cas le plus simple est lorsqu'il s'agit de différents types. Désormais, nous devons davantage considérer ce nouveau type. Par exemple, en PHP7, cette forme de code devient très courante :

try_again:swtich (Z_TYPE_P(zv. )) { case IS_TRING: break; case IS_ARRAY: break; ... case IS_REFERENCE: zv = Z_REFVAL_P(zv); // Déréférencement goto try_again;>


Si vous écrivez vos propres extensions et oublier de considérer ce nouveau type, cela posera des problèmes.

Pourquoi ?

Donc puisque ce nouveau type apportera tant de problèmes, pourquoi avons-nous tourné la référence dans un type ? Pourquoi ne pas simplement utiliser un drapeau ?

En un mot, c'est nous que je dois faire ça -_#

Comme mentionné précédemment, Hashtable stocke directement zval, donc dans la table des symboles, comment deux. zval partage une valeur ? C'est correct pour les types complexes tels que les chaînes, il semble que vous puissiez ajouter un bit d'indicateur à la structure zend_refcounted pour indiquer qu'il s'agit d'une référence pour résoudre le problème. Cependant, cela rencontrera également une copie provoquée par un changement. En écriture, mais nous savons qu'en PHP7, certains types sont directement stockés dans zval, comme IS_LONG, mais les types référence nécessitent un comptage de références, alors comment représenter un zval qui est IS_LONG et IS_REFERNCE ?
Pour cette raison, nous avons créé ce nouveau type :

Comme le montre la figure, Reference est un nouveau type : zend_reference pour zval de type IS_REFERNCE, zval.value.ref est un pointeur vers zend_reference, qui contient un nombre de références et un zval. La valeur spécifique de zval est stockée dans zval.value.ref- >val in .
Donc pour la référence IS_LONG, utilisez un zval de type IS_REFERNCE, qui pointe vers un zend_reference, et ce zend_reference->val est un zval de type IS_LONG.Explication détaillée de référence du noyau PHP7

Change On Write

PHP utilise le comptage de références pour effectuer un garbage collection simple :

<?php1. $val = "laruence";2. $ref = &$val;3. $copy = $val;?>

$ref. et $val pointent vers la même chose. Pour la référence de zval, en PHP5, nous avons représenté cette situation par un nombre de références de 2 et un indicateur de référence de 1. Lors de la copie de $val dans $copy(ligne 3), nous avons constaté que $val est une référence avec un nombre supérieur à 1, donc un changement à l'écriture, c'est-à-dire une séparation, est requis. Nous devons donc copier ce zval.

En PHP7, la situation devient beaucoup plus simple. Tout d'abord, attribuez la référence à. $ref(ligne 2), un type IS_REFERNCE est généré, et comme il y a deux variables qui le référencent à ce moment, le nombre de références de la structure zend_reference zval.value.ref->gc.refcount est 2.

est puis attribué à $ Lors de la copie (ligne 3), on constate que $val est une référence, donc $copy pointe vers zval.value.ref->val, qui est le zval dont la valeur de chaîne est laruence, puis augmente le le nombre de références de zval par 1 , c'est-à-dire que zval.value.ref->val.value.str.gc.refcount est 2. Aucune copie ne se produit.
C'est donc une bonne solution au problème PHP5 classique mentionné dans le chapitre précédent Par exemple, lorsque nous exécutons le problème du chapitre précédent sous PHP7, le résultat que nous obtenons est :

$ php-7.0/sapi/cli/php /tmp/1.phpUsed 0.00021380008539Used 0.00020173048281

On voit qu'aucune copie ne se produit, donc il n'y aura pas de problèmes de performances.

Tutoriel recommandé : "

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!

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