Position actuelle: Accueil> Derniers articles> Comment améliorer les performances des applications PHP via Session_GC?

Comment améliorer les performances des applications PHP via Session_GC?

gitbox 2025-05-29

1. Qu'est-ce que Session_GC?

Session_gc () est une fonction interne de PHP, et sa fonction est d'exécuter le mécanisme de collecte des ordures de la session. PHP déclenchera cette fonction avec une certaine probabilité dans les demandes utilisateur pour nettoyer les fichiers de session expirés. Le comportement par défaut est déterminé par les trois éléments de configuration suivants:

 ini_get('session.gc_probability'); // valeur par défaut:1
ini_get('session.gc_divisor');     // valeur par défaut:100
ini_get('session.gc_maxlifetime'); // valeur par défaut:1440 Deuxième(24 minute)

Autrement dit: dans toutes les 100 demandes, il y a une probabilité que Session_GC soit déclenchée, effaçant tous les fichiers de session qui dépassent GC_MaxlifeTime .

2. L'impact de la session_gc sur les performances

1. Goulot d'étranglement dans le système de fichiers

PHP stocke les données de session dans le système de fichiers du serveur par défaut (généralement le répertoire / TMP ). Chaque fois que Session_GC est exécuté, PHP doit numériser tous les fichiers de session dans ce répertoire pour déterminer les sessions expirées. Cette opération est insensible lorsque le nombre de fichiers de session est faible, mais peut conduire à des frais généraux d'E / S importants lorsqu'il y a une concurrence élevée ou que le temps de rétention de session est long.

2. Problème de compétition de verrouillage

Si plusieurs demandes déclenchent en même temps Session_GC, cela peut entraîner la concurrence de verrouillage, ce qui provoque le blocage de la demande. Ceci est particulièrement dangereux dans les systèmes à haute coeur. Au moins, il réduit la vitesse de réponse et au pire, il remplit directement la charge du serveur.

3. Stratégie d'optimisation pour session_gc

1. Désactivez le GC automatique et utilisez le traitement des tâches chronométrées à la place

L'approche la plus courante consiste à désactiver le GC automatique de PHP, afin que le système puisse la collecte des ordures de manière plus contrôlée (comme les tâches de synchronisation CRON):

 ini_set('session.gc_probability', 0);

Puis configurez une tâche chronométrée, comme l'exécution de la logique de nettoyage toutes les 5 minutes:

 */5 * * * * php /var/www/html/session_gc.php

L'exemple de code de session_gc.php est le suivant:

 <?php
ini_set('session.save_path', '/var/www/html/sessions');
ini_set('session.gc_maxlifetime', 3600); // Définir le temps d&#39;expiration
session_start();
session_gc(); // Effectuer le nettoyage manuellement

2. Utilisez la base de données ou le stockage en mémoire pour remplacer les systèmes de fichiers

En configurant Session.Save_Handler à Memcached ou Redis , l'efficacité de lecture de la session peut être considérablement améliorée et les problèmes de performances du système de fichiers PHP GC peuvent être évités à l'aide des stratégies d'expiration natives de ces systèmes:

 ini_set('session.save_handler', 'redis');
ini_set('session.save_path', 'tcp://gitbox.net:6379');

Le mécanisme TTL de Redis peut supprimer automatiquement les séances expirées sans intervention manuelle.

3. Utilisation de session_lazy_gc (PHP 7.1+)

À partir de PHP 7.1, l'élément de configuration de session.lazy_write a été ajouté et le fichier de session n'est écrit que lorsque les données de session changent. Bien qu'il n'ait pas de relation directe avec Session_GC, il peut réduire les opérations d'écriture inutiles et améliorer indirectement les performances:

 ini_set('session.lazy_write', 1);

4. Cas pratiques: Pratique d'optimisation des plateformes de centres commerciaux à grande échelle

Dans un centre commercial B2C avec d'énormes visites, la configuration d'origine a fait accumuler des centaines de milliers de fichiers de session sous / TMP . Chaque exécution de session_gc a fait monter le CPU et le temps de réponse de la page a augmenté de manière significative.

Le plan d'optimisation est le suivant:

  1. Désactiver GC automatique;

  2. Utilisez Redis pour stocker des sessions;

  3. La tâche d'arrière-plan exécute session_gc () (alternative) une fois par jour à 2 heures du matin;

  4. Ajustez session.gc_maxlifetime à 7200 secondes pour prolonger la période de validité de connexion.

Après s'être connecté, le temps de réponse global du système a chuté de 30% en moyenne, et le temps d'exécution du GC a été raccourci de quelques secondes à quelques dizaines de millisecondes.

V. Conclusion

Bien que Session_GC soit une "tâche backend", son comportement par défaut peut devenir un goulot d'étranglement des performances dans des scénarios de concurrence élevés. Comprendre ses principes et personnaliser les configurations basées sur des scénarios commerciaux réels peut améliorer efficacement la stabilité et les performances des applications PHP.

Résumé des meilleures pratiques:

  • Désactiver le GC automatique dans les grands projets et utiliser des tâches de synchronisation;

  • Essayez d'utiliser Redis / Memcached pour stocker des sessions;

  • Configurer gc_maxlifetime avec une configuration raisonnable;

  • Utilisez session.lazy_write pour réduire les écritures de disque.

La maîtrise de ces compétences ne sera plus une lacune de performance.