Maison >développement back-end >tutoriel php >Gestion de la mémoire et garbage collection des scripts PHP
$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.
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),得到释放
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.
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)
$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.
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),得到释放
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!