Maison développement back-end tutoriel php 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 ?

Jun 24, 2017 am 09:54 AM
php unset 内存 ce qui s'est passé 释放

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

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

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

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 :

Copier après la connexion

Sortie :

int(262144)
int(262144)
int(262144
Copier après la connexion
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 :

Copier après la connexion
<🎜. >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) //是的, 内存正常释放
Copier après la connexion

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


     string(43) "I am php.cn"
    int(93560)
    int(118848)
    int(104448
Copier après la connexion
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 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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Configuration du projet CakePHP Configuration du projet CakePHP Sep 10, 2024 pm 05:25 PM

Dans ce chapitre, nous comprendrons les variables d'environnement, la configuration générale, la configuration de la base de données et la configuration de la messagerie dans CakePHP.

Guide d'installation et de mise à niveau de PHP 8.4 pour Ubuntu et Debian Guide d'installation et de mise à niveau de PHP 8.4 pour Ubuntu et Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 apporte plusieurs nouvelles fonctionnalités, améliorations de sécurité et de performances avec une bonne quantité de dépréciations et de suppressions de fonctionnalités. Ce guide explique comment installer PHP 8.4 ou mettre à niveau vers PHP 8.4 sur Ubuntu, Debian ou leurs dérivés. Bien qu'il soit possible de compiler PHP à partir des sources, son installation à partir d'un référentiel APT comme expliqué ci-dessous est souvent plus rapide et plus sécurisée car ces référentiels fourniront les dernières corrections de bogues et mises à jour de sécurité à l'avenir.

Date et heure de CakePHP Date et heure de CakePHP Sep 10, 2024 pm 05:27 PM

Pour travailler avec la date et l'heure dans cakephp4, nous allons utiliser la classe FrozenTime disponible.

Des sources affirment que Samsung Electronics et SK Hynix commercialiseront de la mémoire mobile empilée après 2026 Des sources affirment que Samsung Electronics et SK Hynix commercialiseront de la mémoire mobile empilée après 2026 Sep 03, 2024 pm 02:15 PM

Selon des informations publiées sur ce site Web le 3 septembre, le média coréen etnews a rapporté hier (heure locale) que les produits de mémoire mobile à structure empilée « de type HBM » de Samsung Electronics et SK Hynix seraient commercialisés après 2026. Des sources ont indiqué que les deux géants coréens de la mémoire considèrent la mémoire mobile empilée comme une source importante de revenus futurs et prévoient d'étendre la « mémoire de type HBM » aux smartphones, tablettes et ordinateurs portables afin de fournir de la puissance à l'IA finale. Selon des rapports précédents sur ce site, le produit de Samsung Electronics s'appelle LPWide I/O memory, et SK Hynix appelle cette technologie VFO. Les deux sociétés ont utilisé à peu près la même voie technique, à savoir combiner emballage en sortance et canaux verticaux. La mémoire LPWide I/O de Samsung Electronics a une largeur de 512 bits.

Téléchargement de fichiers CakePHP Téléchargement de fichiers CakePHP Sep 10, 2024 pm 05:27 PM

Pour travailler sur le téléchargement de fichiers, nous allons utiliser l'assistant de formulaire. Voici un exemple de téléchargement de fichiers.

Routage CakePHP Routage CakePHP Sep 10, 2024 pm 05:25 PM

Dans ce chapitre, nous allons apprendre les sujets suivants liés au routage ?

Discuter de CakePHP Discuter de CakePHP Sep 10, 2024 pm 05:28 PM

CakePHP est un framework open source pour PHP. Il vise à faciliter grandement le développement, le déploiement et la maintenance d'applications. CakePHP est basé sur une architecture de type MVC à la fois puissante et facile à appréhender. Modèles, vues et contrôleurs gu

Comment configurer Visual Studio Code (VS Code) pour le développement PHP Comment configurer Visual Studio Code (VS Code) pour le développement PHP Dec 20, 2024 am 11:31 AM

Visual Studio Code, également connu sous le nom de VS Code, est un éditeur de code source gratuit – ou environnement de développement intégré (IDE) – disponible pour tous les principaux systèmes d'exploitation. Avec une large collection d'extensions pour de nombreux langages de programmation, VS Code peut être c

See all articles