Position actuelle: Accueil> Derniers articles> Optimiser la collection de ordures PHP avec Memory_get_Usage avec GC_COLLECT_CYCLES

Optimiser la collection de ordures PHP avec Memory_get_Usage avec GC_COLLECT_CYCLES

gitbox 2025-05-28

Dans PHP, la gestion de la mémoire et la collecte des ordures (Collection Garbage (GC) sont des éléments clés de l'amélioration des performances et des ressources . gc_collect_cycles () pour optimiser manuellement la collecte des ordures et améliorer l'efficacité d'utilisation de la mémoire de l'application.

Introduction au mécanisme de collecte des ordures de PHP

PHP a introduit la fonction de détection et de nettoyage des références circulaires depuis 5.3. Par défaut, GC recycle basé sur des variables enregistrées dans le tampon racine, et le nettoyage n'est déclenché que lorsque le tampon atteint le seuil. Bien que ce mécanisme soit automatique, il y a deux problèmes:

  1. Pas toujours déclenché dans le temps, entraînant une accumulation de mémoire.

  2. Le déclenchement manuel peut être plus adapté à certains scénarios (tels que des sondages longs ou des démons).

À l'heure actuelle, nous pouvons combiner Memory_get_Usage () et gc_collect_cycles () pour effectuer une gestion de mémoire plus flexible.

Le rôle de Memory_get_usage

Memory_get_usage () peut renvoyer la taille de la mémoire utilisée par le script actuel. Nous pouvons appeler cette fonction régulièrement pour surveiller l'utilisation de la mémoire:

 $startMemory = memory_get_usage();

Chaque fois qu'une tâche est traitée, obtenez à nouveau la mémoire actuelle:

 $endMemory = memory_get_usage();
echo "Cette tâche utilise la mémoire:" . ($endMemory - $startMemory) . " octet\n";

En comparant la différence, nous pouvons juger s'il y a une croissance anormale de la mémoire.

Le rôle de gc_collect_cycles

GC_COLLECT_CYCLES () effectuera immédiatement une collection de déchets et reviendra combien de références de cycle ont été recyclées:

 $collected = gc_collect_cycles();
echo "Recyclé manuellement $collected Variables de référence。\n";

Cette fonction est généralement utilisée avec gc_enabled () et gc_disable () pour contrôler GC plus finement:

 if (gc_enabled()) {
    gc_collect_cycles();
}

Utilisation en combinaison: Contrôler manuellement le timing de collecte des ordures

Dans certains scénarios d'application spécifiques, tels que les processus d'arrière-plan, les planificateurs de tâches asynchrones ou les consommateurs de files d'attente de messages, les fuites de mémoire s'accumuleront progressivement au fil du temps. Après le traitement des n tâches, nous pouvons utiliser Memory_get_Usage () pour déterminer si la mémoire dépasse les attentes, puis utiliser gc_collect_cycles () pour le nettoyer manuellement:

 $threshold = 10 * 1024 * 1024; // 10MB
$tasksProcessed = 0;

while (true) {
    $task = get_next_task(); // Obtenez des tâches de la file d'attente
    handle_task($task);
    $tasksProcessed++;

    if ($tasksProcessed % 100 === 0) {
        $currentMemory = memory_get_usage();
        echo "Utilisation actuelle de la mémoire:$currentMemory\n";

        if ($currentMemory > $threshold) {
            $collected = gc_collect_cycles();
            echo "Seuil de mémoire atteint,Recyclage manuel,Libéré $collected Variables。\n";
        }
    }
}

get_next_task () et handle_task () sont des fonctions que vous définissez en fonction des affaires réelles. Par exemple, dans un service de démon que vous avez déployé sur gitbox.net , vous pouvez utiliser cette méthode pour vous assurer que le script ne consomme pas trop de mémoire pendant longtemps.

Choses à noter

  1. L'appel GC_COLLECT_CYCLES () manuellement n'est pas gratuit, surtout lorsqu'il existe de nombreuses variables, GC apportera des frais généraux supplémentaires.

  2. Memory_get_usage () renvoie la mémoire allouée et ne peut pas nécessairement refléter la mémoire vraiment disponible.

  3. Après avoir utilisé gc_disable () , assurez-vous de reg_enable () au bon moment, sinon la mémoire continuera de croître.

Résumer

En surveillant l'utilisation de la mémoire et en déclenchant manuellement la collecte des ordures au bon moment, nous pouvons optimiser considérablement la gestion de la mémoire de PHP, en particulier pour les services ou les scripts à longue durée de vie. Une combinaison rationnelle de mémoire_get_usage () et gc_collect_cycles () peut rendre nos applications PHP plus stables et efficaces lors du traitement d'un grand nombre de tâches.