"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > PHP : Le Garbage Collector expliqué avec des mots simples

PHP : Le Garbage Collector expliqué avec des mots simples

Publié le 2024-12-11
Parcourir:888

Le Garbage Collector (GC) est le système de gestion de mémoire interne de PHP, mais il y a quelques subtilités à comprendre.

? Pourquoi le GC existe-t-il ?

Le GC automatise la gestion de la mémoire, ce qui élimine les tracas liés à la gestion de la mémoire avec des tâches manuelles (ce qui serait fastidieux).

Cela permet aux développeurs de se concentrer sur leur logique métier sans trop se soucier des erreurs « Mémoire insuffisante ».

Bien sûr, ce n'est pas magique.

? 10 000 objets en bref

La libération des objets qui ne sont plus nécessaires évite les fuites de mémoire.

Le GC utilise un mécanisme de comptage pour déterminer les éléments à supprimer. Si aucune référence ne pointe vers un objet particulier (c'est-à-dire $counter = 0), alors cet objet est éligible pour le nettoyage.

Cela fonctionne plutôt bien, mais certaines références peuvent poser problème :

class A {
    public $b;
}

class B {
    public $a;
}

$a = new A();
$b = new B();

$a->b = $b;
$b->a = $a;

unset($a);
unset($b);

Dans ce cas de mauvaise conception, PHP ne libérera pas la mémoire même si nous supprimons $a et $b, car ils se référencent mutuellement, ce qui amène PHP à croire qu'ils sont toujours utilisés.

Heureusement, il existe un autre mécanisme appelé Cycle Collector pour cela :

gc_collect_cycles();

En gros, le collectionneur parcourt toutes les références et applique un algorithme pour marquer les objets en cours d'utilisation, qui révèle les objets à collecter (ceux non marqués).

Cependant, PHP ne déclenche pas la collecte automatique des cycles tant que le seuil de 10 000 objets avec des références cycliques potentielles n'est pas atteint.

Encore une fois, ce n'est pas magique, vous ne devez donc invoquer gc_collect_cycles() que dans quelques cas.

? TANSTAAFL

Une mauvaise conception peut conduire à des relations trop complexes entre les objets, conduisant à plus de références et à un garbage collection plus fréquent.

Chaque objet compté par référence nécessite un stockage supplémentaire pour son décompte de références.

Source : Wikipédia - Comptage de références

La surcharge associée aux opérations de nettoyage de la mémoire peut avoir un impact significatif sur les performances globales et, à terme, augmenter le temps d'exécution dans des scénarios spécifiques.

Il y a 10 ans, Composer a obtenu une énorme amélioration de ses performances simplement en utilisant la fonction gc_disable().

Source : Composer - désactivation de GC

En effet, PHP 7 a considérablement amélioré le GC, ce n'est donc plus ce qu'il était en 2014.

De plus, les versions PHP 8 ont amélioré les stratégies d'allocation de mémoire et ajouté des statistiques plus utiles sur les opérations GC pour une meilleure surveillance (gc_status() dans 8.3).

La plupart des applications PHP sont basées sur des requêtes et la mémoire est automatiquement vidée à la fin de la requête.

Encore une fois, c'est plutôt cool mais pas magique. Que se passe-t-il avec les requêtes asynchrones et les objets/démons de longue durée ?

Vous pourriez rencontrer des fuites de mémoire à un moment donné.

? Dans quelle mesure le GC de PHP est-il différent ?

À ce stade, vous ne verrez peut-être pas en quoi le GC de PHP diffère des autres langages.

La plupart du temps, d'autres langages ne s'appuient pas sur le comptage de références pour collecter les déchets ou peuvent utiliser des implémentations différentes.

Par exemple, beaucoup utilisent l'algorithme de traçage qui marque également les objets inutilisés mais ne fonctionne pas de manière incrémentielle. C'est un parcours graphique.

En outre, certains langages ne permettent pas un tel contrôle direct (par exemple, marche/arrêt au moment de l'exécution).

Comme d'habitude, il existe certains avantages et inconvénients, vous pouvez donc voir des approches hybrides.

?‍? Interagir avec le GC de PHP

Vous pouvez tirer parti des assistants gc_* intégrés.

Par exemple:

  • gc_collect_cycles déclenche manuellement le garbage collection
  • gc_status() donne l'état actuel
  • gc_disable() le désactive
  • gc_enable() l'active

Ces fonctions sont utiles pour le débogage ou le réglage fin du garbage collection si nécessaire.

? Comprendre les erreurs de mémoire

Vous pouvez lire cet article pour plus d'informations :

PHP: The Garbage Collector explained with simple words

PHP : erreurs de mémoire

spO0q ? ・ 24 mai '23

#php #débutants #programmation

? Des cartes faibles à la rescousse ?

PHP 7.4 a introduit les références faibles et PHP 8 a introduit les cartes faibles.

Une carte faible pourrait être décrite comme une collection de références faibles.

Cette structure de données est un magasin clé-valeur polyvalent qui aide PHP à suivre les éléments sans créer d'encombrement ni consommer d'espace excessif.

Vous pouvez le voir comme un stockage temporaire qui sera immédiatement effacé lorsqu'il n'est plus nécessaire, car il n'y a aucune référence [forte] qui pourrait empêcher le garbage collection :

$object = new stdClass;
$map = new WeakMap();
$map[$object] = true;
$object->name = 'some name';
print_r($map);// $object is stored in $map

unset($object);

print_r($map);// $object is cleaned and no longer available

✅ Avantages

  • assez simple
  • idéal pour la mise en cache ou la mémorisation (par exemple, calculs coûteux)

❌ Inconvénients

  • bien que les clés (objets) n'empêchent pas le garbage collection, les valeurs le peuvent, donc le terme « valeurs arbitraires » peut être trompeur (utilisez uniquement des types de données simples comme valeurs)
  • les cas d'utilisation précieux sont limités

? Optimiser le code

  • exploiter des modèles de conception qui réduisent les interdépendances
  • utiliser l'injection de dépendances
  • ne chargez pas d'ensembles de données trop volumineux en mémoire et utilisez des collections et des générateurs au lieu d'énormes tableaux
  • surveiller l'utilisation de la mémoire
  • profilez votre code avec des métriques
  • utilisez gc_enable(), gc_disable() et gc_collect_cycles() avec parcimonie

Conclure

Pour la plupart des utilisations, vous n'aurez pas à vous soucier de la gestion de la mémoire, puisque PHP s'en charge déjà.

Cependant, étant donné que les piles modernes utilisent des objets à longue durée de vie, vous devez surveiller votre application pour détecter d'éventuelles fuites de mémoire.

Si vous rencontrez des problèmes, vous devrez peut-être optimiser le code et/ou interagir directement avec le GC.

Déclaration de sortie Cet article est reproduit sur : https://dev.to/spo0q/php-the-garbage-collector-explained-with-simple-words-1b7d?1 En cas de violation, veuillez contacter [email protected] pour supprimer il
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3