Maison >développement back-end >tutoriel php >Qu'est-ce que le mécanisme de récupération de place PHP

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

一个新手
一个新手original
2017-09-13 10:00:201579parcourir

 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; );
    ?>

    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;
    )

    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; );
    ?>

    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)=...
    )

    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!

Déclaration:
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