Maison  >  Article  >  développement back-end  >  Que se passe-t-il lorsque la désactivation libère de la mémoire en php ?

Que se passe-t-il lorsque la désactivation libère de la mémoire en php ?

伊谢尔伦
伊谢尔伦original
2017-06-24 09:54:181833parcourir

Tout d'abord, est-ce que sera désactivé dans la mémoire de version PHP ?

Regardons d'abord un exemple :

var_dump(memory_get_usage());
$a = "laruence";
var_dump(memory_get_usage());
unset($a);
var_dump(memory_get_usage());

Sortie (dans On différents ordinateurs personnels, cela peut varier en raison des différents systèmes, versions de PHP et extensions chargées) :

int(90440)
int(90640)
int(90472

Notez que 90472-90440=32, il existe donc différents conclusions. Certaines personnes disent que la désactivation de PHP ne libère pas vraiment de mémoire, et d'autres disent que la désactivation de PHP ne libère que de grandes variables (un grand nombre de chaînes , de grands tableaux libéreront vraiment de la mémoire, et certaines personnes même). dire que cela n'a aucun sens de discuter de la mémoire au niveau PHP.

Alors, unset libérera-t-il la mémoire ? Où sont passés ces 32 octets ?
Pour répondre Pour cette question, je vais partir de deux aspects :
Où sont passés ces 32 octets ?
Tout d'abord nous devons rompre avec une réflexion : PHP n'est pas comme le langage C, seuls les appels que vous affichez. L'allocation de mémoire se produit uniquement avec les API liées à la mémoire.
En d'autres termes, en PHP, il existe de nombreux processus d'allocation de mémoire que nous ne pouvons pas voir
Par exemple :

$a = "laruence";

Implicit Les points d'allocation de mémoire sont :
1. Allouez de la mémoire pour nom de la variable et stockez-la dans la table des symboles
2. Allouez de la mémoire pour la valeur de la variable
Par conséquent, vous ne pouvez pas simplement regarder l'apparence
Deuxièmement. , Ne doutez pas que le non-set de PHP libérera effectivement de la mémoire (bien sûr, il faut aussi le combiner avec des références et du comptage. Pour cette partie, veuillez vous référer à mon article précédent pour une compréhension approfondie des principes de PHP : séparation/référence de variable), mais cette version n'est pas une version au sens de la programmation C, elle n'est pas restituée au système d'exploitation
Pour PHP, elle fournit un ensemble d'API de gestion de la mémoire similaire au langage C pour la mémoire. Ces API sont similaires à l'API C. En conséquence, la mémoire est gérée en interne dans PHP via ces API

Lorsque nous appelons emalloc pour demander de la mémoire, PHP ne demande pas simplement de la mémoire au système d'exploitation, mais le fera. demandez au système d'exploitation un gros bloc de mémoire, puis allouez-en une partie au demandeur, de sorte que lorsqu'il existe une logique de demande de mémoire, il n'est pas nécessaire de demander de la mémoire au système d'exploitation, évitant ainsi les appels système fréquents. 🎜>
Par exemple, comme suit Exemple :

Sortie :

int(262144)
int(262144)
int(262144
C'est-à-dire lorsque nous définissons la variable

$a dans , PHP ne le fait pas. Il n'y a pas de demande de nouvelle mémoire du système.

De même, lorsque nous appelons efree pour libérer de la mémoire, PHP ne rendra pas la mémoire au système d'exploitation, mais mettra cette mémoire dans la liste de mémoire libre maintenue par lui-même . Pour les petits morceaux de mémoire, il est plus probable de la mettre dans la liste de cache mémoire (postscript, certaines versions de PHP, comme PHP5.2.4, 5.2.6, 5.2.8 que j'ai vérifié, lors de l'appel de get_memory_usage(), la taille du bloc de mémoire disponible dans la liste du cache mémoire ne sera pas soustraite, ce qui fera apparaître que la mémoire reste inchangée après une désactivation).

Maintenant laissez-moi vous répondre où vont ces 32 octets. Allez, comme je viens de le dire, de nombreux processus d'allocation de mémoire ne sont pas explicites

Vous comprendrez après avoir lu le code suivant :

Sortie : 

90808-90808 = 0, normal, c'est à dire que ces 32 octets sont occupés par la fonction de sortie (à proprement parler, ils sont occupés par le Header de sortie)
string(43) "I am php.cn"
int(90808) //赋值前
int(90976)
int(90808) //是的, 内存正常释放

Un tableau qui ne fait qu'augmenter mais ne diminue jamais
Hashtable est la structure de base de PHP (pour comprendre Hashtable, vous pouvez vous référer à mon article précédent pour comprendre les tableaux en PHP (ordre de parcours)), et les tableaux sont également représentés par celui-ci, et la table des symboles est également un tableau associatif, pour le code suivant :

Copiez le code

Le code est le suivant :

Nous avons défini 100 variables, puis cliquez sur Annuler pour voir le résultat :
    var_dump("I am www.php.cn");
    var_dump(memory_get_usage());
    $array = array_fill(1, 100, "laruence");
    foreach ($array as $key => $value) {
        ${$value . $key} = NULL;
    }
    var_dump(memory_get_usage());
    foreach ($array as $key=> $value) {
        unset(${$value . $key});
    }
    var_dump(memory_get_usage());


     string(43) "I am php.cn"
    int(93560)
    int(118848)
    int(104448
Wow, pourquoi y a-t-il autant moins de mémoire ?

En effet, pour Hashtable Said, lors de sa définition, il est impossible d'allouer suffisamment de blocs de mémoire à la fois pour enregistrer un nombre inconnu d'éléments, donc PHP n'allouera qu'une petite partie du bloc de mémoire à HashTable lors de l'initialisation, puis utilisez-le quand cela ne suffit pas. L'expansion RESIZE,
et Hashtable ne peuvent qu'agrandir, pas réduire. Pour l'exemple ci-dessus, lorsque nous avons stocké 100 variables, la table des symboles n'était pas suffisante, nous avons donc fait une expansion, et lorsque nous séquentiellement Après avoir désactivé ces 100 variables, la mémoire occupée par les variables est libérée (118848 – 104448), mais la table des symboles n'est pas réduite, donc la petite mémoire est occupée par la table des symboles elle-même...

Maintenant, avez-vous une compréhension préliminaire de la gestion de la mémoire PHP ?

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