Maison > Article > développement back-end > Qu'est-ce que le mécanisme de récupération de place PHP
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.
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( 'meaning' => 'life', 'number' => 42 ); $a['life'] = $a['meaning']; xdebug_debug_zval( 'a' ); ?>
Le résultat de la routine ci-dessus est le suivant :
a: (refcount=1, is_ref=0)=array ( 'meaning' => (refcount=2, is_ref=0)='life', 'number' => (refcount=1, is_ref=0)=42, 'life' => (refcount=2, is_ref=0)='life' )
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( 'one' ); $a[] =& $a; xdebug_debug_zval( 'a' ); unset($a); xdebug_debug_zval( 'a' ); ?>
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)='one', 1 => (refcount=1, is_ref=1)=... )
cycle de recyclage
Activer et désactiver le mécanisme de collecte des ordures
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!