Notes d'étude sur les variables PHP et la gestion de la mémoire

高洛峰
Libérer: 2023-03-06 14:54:02
original
1394 Les gens l'ont consulté

1. fonction memory_get_usage

int memory_get_usage ([ bool $real_usage = false ] )


Mémoire utilisée par le script PHP (à l'exclusion de memory_get_usage() Le mémoire occupée par la fonction elle-même)

Le paramètre $real_usage de memory_get_usage() est par défaut FALSE lorsqu'il est défini sur TRUE, la valeur mémoire obtenue est la mémoire occupée par la gestion de la mémoire PHP.

//php分配到的内存
var_dump(memory_get_usage(true));
//php使用内内存
var_dump(memory_get_usage());
Copier après la connexion

Résultat

int 262144
int 239368


Le mécanisme de gestion de la mémoire de PHP est : pré-allouer un espace, Utilisé pour stocker des variables Lorsque l'espace n'est pas suffisant, demandez un nouvel espace.

memory_get_usage(true) est la mémoire pré-allouée.


Je n'ai jamais prêté attention à l'utilisation de la mémoire des pages PHP auparavant. Cette fonction devrait également être utilisée pour analyser le code lors de l'optimisation de la page à l'avenir.


2. Affectation des variables et mémoire

var_dump(memory_get_usage());
 
$a = "Hello World";
var_dump(memory_get_usage());
 
$b = $a;
var_dump(memory_get_usage());
 
unset($b);
var_dump(memory_get_usage());
 
unset($a);
var_dump(memory_get_usage());
Copier après la connexion

Résultat

int 239776
int 239912
int 240000
int 239912
int 239776


239912-239776=136

240000-239912=88


La mémoire utilisée par les affectations $a et $b est différente. La raison est que l'affectation $b n'alloue pas de mémoire. Ces 88 octets sont occupés par la fonction de sortie.

De plus, la destruction de $b n'affecte pas la mémoire utilisée par $a. C'est la raison du comptage des références de gestion de la mémoire

Vous pouvez clairement comprendre la relation entre l'affectation des variables et la mémoire en changeant. l'exemple

var_dump(memory_get_usage());
 
$a = "Hello World";
var_dump(memory_get_usage());
 
$b = "Hello World";
var_dump(memory_get_usage());
 
unset($b);
var_dump(memory_get_usage());
 
unset($a);
var_dump(memory_get_usage());
Copier après la connexion

Résultat

int 239816
int 239952
int 240088
int 239952
int 239816

239952 -23 9816= 136

240088-239952=136


De plus, les règles d'utilisation de la mémoire de l'affectation de référence sont similaires à celles de l'affectation directe, qui implique également les règles de comptage de références de gestion de la mémoire


3. Mécanisme de récupération de place PHP, cette partie n'est pas suffisamment comprise, enregistrez simplement une fonction

xdebug_debug_zval. doit installer l'extension xdebug

$a = "Hello World";
xdebug_debug_zval('a');
Copier après la connexion

Output

a:

(refcount=1, is_ref=0),string 'Hello World ' (longueur = 11)

refcount Le nombre de variables pointant vers la valeur

is_ref représente s'il existe une référence d'adresse

Type

Valeur

Lors de l'attribution d'une valeur à une variable : is_ref est faux refcount For 1

Adresse manuelle

Connaissance de base du comptage de références

http:/ /php.net/manual/zh/features.gc.refcounting-basics.php

Chaque variable php est stockée dans un conteneur de variables appelé "zval". Un conteneur de variable zval contient, en plus du type et de la valeur de la variable, deux octets d'informations supplémentaires. Le premier est "is_ref", qui est une valeur booléenne utilisée pour identifier si cette variable appartient à l'ensemble de référence. Grâce à cet octet, le moteur PHP peut distinguer les variables ordinaires des variables de référence. Puisque PHP permet aux utilisateurs d'utiliser des références personnalisées en utilisant &, il existe également un mécanisme de comptage de références interne dans le conteneur de variables zval pour optimiser l'utilisation de la mémoire. Le deuxième octet supplémentaire est "refcount", qui est utilisé pour indiquer le nombre de variables (également appelées symboles) pointant vers ce conteneur de variables zval. Tous les symboles existent dans une table de symboles, où chaque symbole a une portée (scope), le script principal (par exemple : le script demandé via le navigateur) et chaque fonction ou méthode ont également une porté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!