Qu'est-ce que le mécanisme de récupération de place PHP

一个新手
Libérer: 2023-03-16 06:20:01
original
1496 Les gens l'ont consulté

 La seule raison de la mise en œuvre d'un mécanisme de récupération de place est d'économiser l'empreinte mémoire en nettoyant les variables référencées de manière circulaire.

  1. Nombre de références : Les variables PHP existent dans un conteneur de variables appelé "zval". Un conteneur de variable zval, en plus du type et de la valeur de la variable, comprend également deux octets d'informations supplémentaires : is_ref et refcount. is_ref est une valeur booléenne, utilisée pour identifier si cette variable appartient à une collection de référence, afin que le moteur PHP puisse distinguer les variables ordinaires des variables de référence ; refcount est utilisé pour représenter le nombre de variables pointant vers ce conteneur de variables zval lorsque refcount =. 0, cela signifie que les variables peuvent être effacées ou recyclées

    <?php
    $a = array( &#39;meaning&#39; => &#39;life&#39;, &#39;number&#39; => 42 );
    $a[&#39;life&#39;] = $a[&#39;meaning&#39;];
    xdebug_debug_zval( &#39;a&#39; );
    ?>
    Copier après la connexion

    Le résultat de la routine ci-dessus est le suivant :

    a: (refcount=1, is_ref=0)=array (
       &#39;meaning&#39; => (refcount=2, is_ref=0)=&#39;life&#39;,
       &#39;number&#39; => (refcount=1, is_ref=0)=42,
       &#39;life&#39; => (refcount=2, is_ref=0)=&#39;life&#39;
    )
    Copier après la connexion

    La sortie de Xdebug est affichée sous la forme de deux conteneurs de variables zval avec des valeurs​​'life', qui sont en fait les mêmes : >Les résultats de l'exemple ci-dessus sont les suivants :

    <?php
    $a = array( &#39;one&#39; );
    $a[] =& $a;
    xdebug_debug_zval( &#39;a&#39; );
    unset($a);
    xdebug_debug_zval( &#39;a&#39; );
    ?>
    Copier après la connexion

    Bien que l'exemple ci-dessus n'ait plus de symboles dans une portée pointant vers ce conteneur de variable, car le l'élément de tableau "1" pointe toujours vers le tableau lui-même, ce conteneur ne peut donc pas être effacé. Puisqu’aucun autre symbole ne pointe vers cette structure, l’utilisateur n’a aucun moyen d’effacer la structure, ce qui entraîne une fuite de mémoire. PHP effacera cette structure de données à la fin de l'exécution du script, mais avant que PHP ne l'efface, il consommera beaucoup de mémoire

    (refcount=1, is_ref=1)=array (
       0 => (refcount=1, is_ref=0)=&#39;one&#39;,
       1 => (refcount=1, is_ref=1)=...
    )
    Copier après la connexion

    cycle de recyclage
  2.  : Peut être utilisé pour traiter les fuites de mémoire causées par des références circulaires. Si le nombre de références d'un conteneur de variable augmente, il continuera à être utilisé et bien sûr ne sera plus à la poubelle ; si le nombre de références diminue jusqu'à zéro, le conteneur de variable sera vidé (libre). C'est-à-dire qu'un cycle de déchets ne se produira que lorsque le nombre de références est réduit à une valeur non nulle ; deuxièmement, dans un cycle de déchets, en vérifiant si le nombre de références est réduit de 1 (simulation) et en vérifiant quels conteneurs de variables ; avoir des références Le nombre de fois est nul, pour savoir quelle partie est une poubelle
  3. Activer et désactiver le mécanisme de collecte des ordures
  4.  : Dans En plus de modifier la configuration
  5. zend.enable_gc , vous pouvez également activer et désactiver le mécanisme de récupération de place en appelant respectivement les fonctions

    gc_enable() et gc_disable(). De plus, Les racines possibles sont enregistrées même lorsque le mécanisme de récupération de place n'est pas disponible, de sorte qu'à chaque fois qu'une racine possible est trouvée, il n'est pas nécessaire de vérifier si le mécanisme de récupération de place est activé et l'opération d'enregistrement est plus rapide . L’appel de la fonction gc_collect_cycles() peut forcer le recyclage du cycle.

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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!