Maison  >  Article  >  développement back-end  >  Sélection de 3 questions d'entretien pour vous aider à comprendre le mécanisme de récupération de place de PHP ! !

Sélection de 3 questions d'entretien pour vous aider à comprendre le mécanisme de récupération de place de PHP ! !

青灯夜游
青灯夜游avant
2021-06-04 19:25:483271parcourir

Cet article partagera avec vous des questions d'entretien avancées sur le mécanisme de récupération de place PHP et vous donnera une compréhension approfondie du mécanisme de récupération de place PHP. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il sera utile à tout le monde.

Sélection de 3 questions d'entretien pour vous aider à comprendre le mécanisme de récupération de place de PHP ! !

ps : Cet article comprend une sélection de questions d'entretien et d'articles de connaissances.

Questions d'entretien PHP sur le mécanisme de collecte des ordures de PHP, comptage de références du mécanisme de collecte des ordures de PHP (comptage de références) Mécanisme GC, PHP peut gérer automatiquement la mémoire et effacer les objets inutiles, questions d'entretien PHP partageant des questions d'entretien PHP sur le mécanisme de collecte des ordures :

Étude recommandée : "Tutoriel vidéo PHP"

Questions d'entretien


Présentez le mécanisme de récupération de place de PHP

PHP utilise le mécanisme GC de comptage de références (comptage de références), et également utilise le mécanisme du tampon racine. Lorsque PHP découvre qu'il existe un zval avec une référence circulaire, il le placera dans le tampon racine. Lorsque le tampon racine atteint le numéro spécifié dans le fichier de configuration, il éliminera le recyclage pour résoudre la fuite de mémoire. problème causé par les références circulaires.

  • 1. Si le nombre de références est réduit à zéro, le conteneur de variables sera effacé (libre) et n'est pas une poubelle
  • Si le nombre de références d'un zval est. réduit et est toujours supérieur à 0, il entrera alors dans le cycle des déchets. Deuxièmement, pendant un cycle de déchets, découvrez quelles parties sont des déchets en vérifiant si le nombre de références est réduit de 1 et en vérifiant quels conteneurs de variables ont zéro référence.

Chaque objet contient un compteur de référence refcount. Chaque référence est connectée à l'objet et le compteur est incrémenté de 1. Lorsque la référence quitte l'espace de vie ou est définie sur NULL, le compteur est décrémenté de 1. Lorsque le compteur de références d'un objet atteint zéro, PHP sait que vous n'avez plus besoin d'utiliser cet objet et libère l'espace mémoire qu'il occupe.

Laquelle des affirmations suivantes concernant le garbage collection PHP est incorrecte ?

A. L'activation/désactivation du mécanisme de récupération de place peut être réalisée en modifiant la configuration php

B Il peut être activé et désactivé en utilisant gc_enable() et gc_disable() dans le programme.

C. Le mécanisme de récupération de place en PHP améliorera considérablement les performances du système.

D. Après avoir activé le mécanisme de récupération de place, une grande quantité d'espace mémoire peut être économisée en cas de fuite de mémoire. Cependant, comme l'algorithme de récupération de place prend du temps, son activation sera nécessaire. augmenter le temps d'exécution du script.

Réponse de référence : C
Analyse de la réponse : Le mécanisme de collecte des ordures en PHP n'augmentera la consommation de temps que lorsque l'algorithme de recyclage est réellement en cours d'exécution. Mais dans les scripts normaux (plus petits), il ne devrait y avoir aucun impact sur les performances.

Quelle affirmation concernant le mécanisme de récupération de place PHP est fausse ?

A. Dans un cycle de déchets, découvrez quelle partie est un déchet en vérifiant si le nombre de références est réduit de 1 et en vérifiant quels conteneurs variables ont des temps de référence nuls

B. Vous pouvez activer et désactiver le mécanisme de récupération de place en appelant les fonctions gc_enable() et gc_disable()

C Économisez l'utilisation de la mémoire en nettoyant les variables inutilisées

D php Garbage collection. sera automatiquement effectué une fois le code exécuté, il n'est donc pas nécessaire d'effectuer manuellement le garbage collection

Réponse de référence : D
Analyse de la réponse : un morceau de code PHP L'exécution peut prendre beaucoup de temps, mais s'il y a des variables non référencées pendant cette période, cela occupera de l'espace mémoire et provoquera des problèmes tels qu'un fonctionnement lent

Chapitre de connaissances


1.Concept

La collecte des déchets est une caractéristique commune. dans la plupart des langages de programmation. Certains mécanismes de gestion de la mémoire. Contrairement aux langages non gérés : C, C++ et Objective C, où les utilisateurs doivent collecter manuellement de la mémoire, les langages dotés de mécanismes GC : Java, javaScript et PHP peuvent gérer automatiquement la mémoire.

Le mécanisme de collecte des déchets (gc), comme son nom l'indique, signifie réutilisation des déchets et est un système d'allocation de stockage dynamique. Il libère automatiquement les blocs de mémoire alloués qui ne sont plus nécessaires au programme. Le mécanisme de récupération de place permet aux programmeurs de ne pas trop se soucier de l'allocation de mémoire du programme, afin qu'ils puissent consacrer plus d'énergie à la logique métier.

Parmi les différents langages populaires aujourd'hui, le mécanisme de garbage collection est une caractéristique commune de la nouvelle génération de langages, tels que Python, PHP, C#, Ruby, etc.

2. Mécanisme de récupération de place PHP

1 Avant PHP5.3, le mécanisme de récupération de place utilisé était simplement 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 :
weight. L'une s'appelle 'is_ref', qui est une valeur booléenne utilisée pour indiquer si cette variable appartient à l'ensemble 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', qui est utilisé pour indiquer le nombre de variables pointant vers ce conteneur.

C'est-à-dire :

① Chaque objet mémoire se voit attribuer un compteur Lorsque l'objet mémoire est référencé par une variable, le compteur + 1; >② Lorsque Après la suppression de la référence variable (après l'exécution de unset()), le compteur est -1

③ Lorsque le compteur = 0, cela indique que l'objet mémoire n'est pas utilisé, l'objet mémoire est détruit et la collecte des déchets est terminée.

Et PHP libérera le contenu occupé par ce processus/thread après la fin d'un cycle de vie. Cette méthode détermine que PHP n'a pas besoin de prendre en compte trop de fuites de mémoire au début.

Mais lorsque deux objets ou plus se réfèrent l'un à l'autre pour former un anneau, le compteur de l'objet mémoire ne sera pas réduit à 0 à ce moment, ce groupe d'objets mémoire n'est plus utile, mais ne peut pas ; être recyclé, provoquant ainsi des fuites de mémoire.

À partir de php5.3, un nouveau mécanisme de garbage collection a été utilisé. Basé sur le comptage de références, un algorithme complexe a été implémenté pour détecter l'existence d'anneaux de référence dans les objets mémoire afin d'éviter les fuites de mémoire.

2. Avec le développement de PHP, l'augmentation du nombre de développeurs PHP et l'expansion de la portée commerciale qu'il porte, un mécanisme de collecte des ordures plus complet et un nouveau garbage collection ont été introduits dans PHP5.3. Le mécanisme résout le problème des fuites de mémoire de référence qui ne peuvent pas gérer les cycles.
  • Comme le dit la documentation officielle : Chaque variable php existe dans un conteneur de variables appelé "zval". Un conteneur de variable zval contient, en plus du type et de la valeur de la variable, deux octets d'informations supplémentaires. Le premier est "is_ref", qui est une 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. Puisque PHP permet aux utilisateurs d'utiliser des références personnalisées en utilisant &, il existe également un mécanisme de comptage de références interne dans le conteneur de variables zval pour optimiser l'utilisation de la mémoire.

Le deuxième octet supplémentaire est "refcount", qui est utilisé pour indiquer le nombre de variables (également appelées symboles) pointant vers ce conteneur de variables zval. Tous les symboles existent dans une table de symboles et chaque symbole a une portée.

La documentation officielle indique que vous pouvez utiliser Xdebug pour vérifier le nombre de références :

<?php $a = "new string";
$c = $b = $a;
xdebug_debug_zval( &#39;a&#39; );
unset( $b, $c );
xdebug_debug_zval( &#39;a&#39; );
?>

La routine ci-dessus affichera :

a: (refcount=3, is_ref=0)='new string'
a: (refcount=1, is_ref=0)='new string'

Remarque : à partir de la version NTS de PHP7, les références aux routines ci-dessus ne seront plus comptées, soit

c=c=c=b=$a Le décompte de référence d'un après b=$a vaut également 1 .La classification spécifique est la suivante : En PHP 7, zval peut être compté en référence ou non. Il y a un indicateur dans la structure zval qui détermine cela.

① Pour les variables de type null, bool, int et double, refcount ne comptera jamais ;

② Pour les objets et les types de ressources, refcount est cohérent avec php5 ; Pour les chaînes, la variable non citée est appelée « chaîne réelle ». Ces chaînes référencées sont dédupliquées (c'est-à-dire qu'il n'y a qu'une seule chaîne insérée avec un contenu spécifique) et leur existence est garantie pendant toute la durée de la requête, il n'est donc pas nécessaire d'utiliser le comptage de références pour elles si opcache est utilisé. Ces chaînes resteront vivantes ; en mémoire partagée, auquel cas vous ne pouvez pas utiliser le comptage de références (car notre mécanisme de comptage de références est non atomique

④Pour les tableaux, les variables non référencées sont appelées "Tableau immuable". Le nombre du tableau lui-même est cohérent avec PHP5, mais le nombre de chaque paire clé-valeur du tableau est basé sur les trois règles précédentes (c'est-à-dire que s'il s'agit d'une chaîne, elle n'est pas comptée si opcache est utilisé) ; , le littéral du tableau constant dans le code sera Convertir en tableau immuable.

Encore une fois, ceux-ci vivent en mémoire partagée et ne peuvent donc pas utiliser le refcounting.

Notre exemple de démonstration est le suivant :

<?php echo &#39;测试字符串引用计数&#39;;
$a = "new string";
$b = $a;
xdebug_debug_zval( &#39;a&#39; );
unset( $b);
xdebug_debug_zval( &#39;a&#39; );
$b = &$a;
xdebug_debug_zval( &#39;a&#39; );
echo &#39;测试数组引用计数&#39;;
$c = array(&#39;a&#39;,&#39;b&#39;);
xdebug_debug_zval( &#39;c&#39; );
$d = $c;
xdebug_debug_zval( &#39;c&#39; );
$c[2]=&#39;c&#39;;
xdebug_debug_zval( &#39;c&#39; );
echo &#39;测试int型计数&#39;;
$e = 1;
xdebug_debug_zval( &#39;e&#39; );

Le résultat vu est le suivant :

Sélection de 3 questions dentretien pour vous aider à comprendre le mécanisme de récupération de place de PHP ! !3. Cycle de recyclage

Par défaut, le mécanisme de récupération de place de PHP est activé, et il existe un paramètre php.ini qui vous permet de le modifier : zend.enable_gc.

Lorsque le mécanisme de récupération de place est activé, l'algorithme déterminera que chaque fois que le tampon racine est plein, une recherche en boucle sera effectuée. La zone de cache racine a une taille fixe, la valeur par défaut est de 10 000. Cette valeur peut être modifiée en modifiant la constante GC_ROOT_BUFFER_MAX_ENTRIES dans le fichier de code source PHP Zend/zend_gc.c puis en recompilant PHP. Lorsque le garbage collection est désactivé, l'algorithme de recherche de boucle n'est jamais exécuté, cependant, la racine existera toujours dans le tampon racine, que le garbage collection soit activé ou non dans la configuration.

En plus de modifier la configuration zend.enable_gc, vous pouvez également activer et désactiver le mécanisme de récupération de place lors de l'exécution de PHP en appelant respectivement les fonctions gc_enable() et gc_disable(). L’appel de ces fonctions a le même effet que la modification des éléments de configuration pour activer ou désactiver le mécanisme de récupération de place. Possibilité de forcer une collecte périodique même lorsque le tampon racine n'est pas plein. Vous pouvez appeler la fonction gc_collect_cycles() à cet effet. Cette fonction renverra le nombre de cycles recyclés à l'aide de cet algorithme.

La raison pour laquelle vous autorisez l'activation et la désactivation du garbage collection et l'initialisation autonome est que certaines parties de votre application peuvent être sensibles au facteur temps. Dans ce cas, vous ne souhaiterez probablement pas utiliser le garbage collection. Bien entendu, la désactivation du garbage collection pour certaines parties de votre application entraîne un risque de fuites de mémoire, car certaines racines possibles peuvent ne pas rentrer dans le tampon racine limité.

Par conséquent, juste avant d'appeler la fonction gc_disable() pour libérer de la mémoire, il peut être judicieux d'appeler d'abord la fonction gc_collect_cycles(). Parce que cela effacera toutes les racines possibles qui ont été stockées dans le tampon racine, lorsque le mécanisme de récupération de place est désactivé, un tampon vide peut être laissé pour avoir plus d'espace pour stocker les racines possibles.

4. Impact sur les performances

1. Économie d'espace mémoire

Tout d'abord, toute la raison de la mise en œuvre du mécanisme de récupération de place Le but est d'économiser l'utilisation de la mémoire en nettoyant les variables référencées de manière circulaire une fois que les conditions préalables sont remplies. Dans l'exécution PHP, le garbage collection est effectué une fois que le tampon racine est plein ou que la fonction gc_collect_cycles() est appelée.

2. Augmentation du temps d'exécution

Le deuxième domaine dans lequel le garbage collection affecte les performances est le temps nécessaire pour libérer la mémoire ayant fui.

Habituellement, le mécanisme de collecte des déchets en PHP n'augmente la consommation de temps que lorsque l'algorithme de recyclage est réellement en cours d'exécution. Mais dans les scripts normaux (plus petits), il ne devrait y avoir aucun impact sur les performances.

3. Lorsqu'un mécanisme de recyclage est exécuté dans les scripts ordinaires, l'économie de mémoire permettra à davantage de scripts de ce type de s'exécuter sur votre serveur en même temps. Parce que la mémoire totale utilisée n'a pas atteint la limite supérieure.

Cet avantage est particulièrement évident dans les scripts à exécution longue, tels que les suites de tests à exécution longue ou les scripts démon. Dans le même temps, pour les applications de script qui s'exécutent généralement plus longtemps que les scripts Web, le nouveau mécanisme de récupération de place devrait considérablement modifier l'opinion de longue date selon laquelle les fuites de mémoire sont difficiles à résoudre.

Enfin, je souhaite à tous un entretien réussi et recevez votre offre préférée.

Pour plus de connaissances liées à la programmation, veuillez visiter : Introduction à la programmation ! !

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