Maison >développement back-end >tutoriel php >Gestion de la mémoire et garbage collection des scripts PHP

Gestion de la mémoire et garbage collection des scripts PHP

不言
不言original
2018-05-30 09:57:411672parcourir

Cet article partage avec vous la gestion de la mémoire et le garbage collection des scripts PHP. Il vous montre la gestion de la mémoire et le garbage collection des scripts PHP à travers des exemples. Les amis dans le besoin peuvent s'y référer.

Affectation de référence

$a = 'apple';
$b = &$a;

Dans le code ci-dessus, j'attribue une chaîne à la variable a, puis j'attribue la référence de a à la variable b. Évidemment, la mémoire pointant à ce moment devrait être comme ceci :

$a -> 'apple' <- $b

a et b pointent vers la même zone mémoire (conteneur de variable). Nous obtenons var_dump($a, $b) via string(5) "apple" string(5) "apple", ce que nous obtenons. résultat attendu.


Comptage de références et unset()

Supposons que je veuille libérer la chaîne &#39;apple&#39; de la mémoire. J'ai fait ceci :

unset($a);

Mais en imprimant à nouveau les informations des deux variables $a $b, j'ai obtenu ce résultat : Notice: Undefined variable: a et string(5) "apple" . C'est étrange. $a $b pointe à la fois vers une zone mémoire et libère clairement $a Pourquoi $b est-il toujours &#39;apple&#39; ?

En fait, c'est comme ça. unset() Cela détruit un pointeur de variable et ne libère pas la zone mémoire (conteneur de variable), donc une fois l'opération terminée, le pointeur de mémoire devient comme ceci :

&#39;apple&#39; <- $b

Points clés à retenir : unset() ne libère pas la mémoire (conteneur de variable) pointée par la variable, mais détruit uniquement le pointeur de variable. En même temps, réduisez le nombre de références (ref count) de ce morceau de mémoire de 1. Lorsque le nombre de références est 0, c'est-à-dire lorsque ce morceau de mémoire (conteneur de variable) n'est pas référencé par n'importe quelle variable, il sera déclenché par le garbage collection PHP.

Vérifiez-le avec le code :

$a = &#39;apple&#39;;
$b = &$a;

$before = memory_get_usage();
unset($a);
$after = memory_get_usage();

var_dump($before - $after);  // 结果为int(0),没有释放
$a = &#39;apple&#39;;
$b = &$a;

$before = memory_get_usage();
unset($a, $b);
$after = memory_get_usage();

var_dump($before - $after);  // 结果为int(24),得到释放

Recyclez directement

Alors que faut-il faire pour vraiment libérer &#39;apple&#39;Et qu'en est-il la mémoire occupée ?

En utilisant la méthode ci-dessus, nous pouvons utiliser unset($a) puis unset($b) pour détruire toutes les références dans la zone mémoire. Lorsque le nombre de références est réduit à 0, il sera naturellement recyclé par PHP.

Bien sûr, il existe une méthode plus directe :

$a = null;

L'affectation directe null videra la zone mémoire pointée par $a et remettra le compteur de références à zéro. la mémoire est libérée.


L'exécution du script se termine

php est un langage de script Lorsque l'exécution du script se termine, toute la mémoire utilisée dans le script sera libérée. Alors, est-il logique que nous libérions manuellement la mémoire ? En fait, il y a une réponse à cette question depuis longtemps. Je recommande à tout le monde de lire un article publié par Brother Bird @laruence en 2012 : Veuillez libérer les ressources manuellement (Veuillez libérer les ressources manuellement)

Tâche de référence.

$a = &#39;apple&#39;;
$b = &$a;

Dans le code ci-dessus, j'attribue une chaîne à la variable a, puis j'attribue la référence de a à la variable b. Évidemment, la mémoire pointant à ce moment devrait être comme ceci :

$a -> 'apple' <- $b

a et b pointent vers la même zone mémoire (conteneur de variable). Nous obtenons var_dump($a, $b) via string(5) "apple" string(5) "apple", ce que nous obtenons. résultat attendu.


Comptage de références et unset()

Supposons que je veuille libérer la chaîne 'apple' de la mémoire. J'ai fait ceci :

unset($a);

Mais en imprimant à nouveau les informations des deux variables $a $b, j'ai obtenu ce résultat : Notice: Undefined variable: a et string(5) "apple" . C'est étrange. $a $b pointe à la fois vers une zone mémoire et libère clairement $a Pourquoi $b est-il toujours 'apple' ?

En fait, c'est comme ça. unset() Cela détruit un pointeur de variable et ne libère pas la zone mémoire (conteneur de variable), donc une fois l'opération terminée, le pointeur de mémoire devient comme ceci :

'apple' <- $b

Points clés à retenir : unset() ne libère pas la mémoire (conteneur de variable) pointée par la variable, mais détruit uniquement le pointeur de variable. En même temps, réduisez le nombre de références (ref count) de ce morceau de mémoire de 1. Lorsque le nombre de références est 0, c'est-à-dire lorsque ce morceau de mémoire (conteneur de variable) n'est pas référencé par n'importe quelle variable, il sera déclenché par le garbage collection PHP.

Vérifiez-le avec le code :

$a = 'apple';
$b = &$a;

$before = memory_get_usage();
unset($a);
$after = memory_get_usage();

var_dump($before - $after);  // 结果为int(0),没有释放
$a = 'apple';
$b = &$a;

$before = memory_get_usage();
unset($a, $b);
$after = memory_get_usage();

var_dump($before - $after);  // 结果为int(24),得到释放

Recyclez directement

Alors que faut-il faire pour vraiment libérer 'apple'Et qu'en est-il la mémoire occupée ?

En utilisant la méthode ci-dessus, nous pouvons utiliser unset($a) puis unset($b) pour détruire toutes les références dans la zone mémoire. Lorsque le nombre de références est réduit à 0, il sera naturellement recyclé par PHP.

Bien sûr, il existe une méthode plus directe :

$a = null;

L'affectation directe null videra la zone mémoire pointée par $a et remettra le compteur de références à zéro. la mémoire est libérée.

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