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

不言
Libérer: 2023-03-22 17:42:02
original
1571 Les gens l'ont consulté

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;
Copier après la connexion

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
Copier après la connexion

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);
Copier après la connexion
Copier après la connexion

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
Copier après la connexion

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),没有释放
Copier après la connexion
$a = &#39;apple&#39;;
$b = &$a;

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

var_dump($before - $after);  // 结果为int(24),得到释放
Copier après la connexion

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;
Copier après la connexion

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;
Copier après la connexion

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
Copier après la connexion

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);
Copier après la connexion
Copier après la connexion

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
Copier après la connexion

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),没有释放
Copier après la connexion
$a = 'apple';
$b = &$a;

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

var_dump($before - $after);  // 结果为int(24),得到释放
Copier après la connexion

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;
Copier après la connexion

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!

É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!