Dans le mécanisme de collecte des ordures de PHP, gc_mem_caches et gc_collect_cycles sont deux fonctions très importantes. Les utiliser raisonnablement peut considérablement améliorer l'efficacité du recyclage de la mémoire, réduire le risque de fuite de mémoire et optimiser les performances du programme. Cet article introduira en détail les fonctions, les méthodes d'utilisation et les meilleures pratiques pour implémenter la gestion de la mémoire en collaboration avec ces deux fonctions.
Dans PHP, la collecte des ordures (GC) est responsable de recyclage automatiquement les variables et les objets qui ne sont plus référencés pour éviter les fuites de mémoire. PHP suit les variables via un mécanisme de comptage de référence, mais pour les références circulaires (deux objets ou plus se référent les uns aux autres), un simple comptage de référence ne peut pas être recyclé et un mécanisme de collecte des ordures est requis.
gc_collect_cycles () est une fonction fournie par PHP qui déclenche activement la collecte des ordures. Il scanne et recycle toutes les ordures générées par des références circulaires.
Effectuez un cycle de collecte des ordures complet, en essayant de recycler toute la mémoire référencée circulaire.
Renvoie le nombre de boucles recyclées.
<?php
// Créer un exemple de référence circulaire
class A {
public $b;
}
class B {
public $a;
}
$a = new A();
$b = new B();
$a->b = $b;
$b->a = $a;
// Déclencher activement la collection d'ordures
$collected = gc_collect_cycles();
echo "Recyclé $collected Mémoire référencée\n";
?>
La fonction gc_mem_caches () est utilisée pour nettoyer le cache à l'intérieur de la collection des ordures et libérer de la mémoire. Ces caches sont généralement des structures de données temporaires générées lors de la collecte des ordures.
Nettoyez le cache interne du collecteur des ordures et libérez de la mémoire supplémentaire.
Les références de recyclage ne seront pas recyclées activement et seules les données mises en cache seront publiées.
<?php
// Nettoyer GC cache,Mémoire libre
gc_mem_caches();
echo "已Nettoyer垃圾回收cache\n";
?>
Dans le script PHP en cours d'exécution, le simple fait d'appeler GC_COLLECT_CYCLES () peut recycler la mémoire de référence circulaire, mais le cache de collecte des ordures existe toujours et prend une mémoire supplémentaire. À l'heure actuelle, si gc_mem_caches () est appelé immédiatement, ces caches peuvent être libérées pour réduire davantage l'utilisation de la mémoire.
<?php
// Collection de déclenchement des ordures
$collected = gc_collect_cycles();
echo "Recyclé $collected Recycler la référence\n";
// Nettoyer GC cache,Libérez de mémoire supplémentaire
gc_mem_caches();
echo "垃圾回收cache已Nettoyer\n";
?>
Par exemple, les scripts PHP à long terme (tels que les démons, les scripts CLI et les travailleurs de la file d'attente des tâches) ont une utilisation élevée de la mémoire et sont sujets à des références circulaires. Il est recommandé d'appeler ces deux fonctions régulièrement et de manière proactive.
Exemple:
<?php
while (true) {
// Simuler la logique commerciale
do_something();
// 定期进行垃圾回收和cacheNettoyer
$collected = gc_collect_cycles();
gc_mem_caches();
echo "Recyclé $collected Recycler la référence,cache已Nettoyer\n";
// Dormir,Empêcher une utilisation excessive CPU
sleep(10);
}
?>
gc_collect_cycles () est utilisé pour recycler la mémoire référencée.
gc_mem_caches () est utilisé pour nettoyer le cache interne du collecteur des ordures.
Utilisé en combinaison peut plus efficacement de mémoire libre et réduire les fuites de mémoire et le ballonnement.
Dans les scripts de longue durée, l'appel de ces deux fonctions aide à maintenir la mémoire stable.
La maîtrise et l'utilisation correcte de ces deux fonctions peuvent considérablement améliorer l'efficacité de récupération de la mémoire des programmes PHP et assurer les performances et la stabilité de l'application.
Si vous voulez en savoir plus sur le mécanisme de collecte des ordures PHP, vous pouvez visiter:
https://gitbox.net/manual/en/fonction.gc-collect-cycles.php
https://gitbox.net/manual/en/fonction.gc-mem-caches.php