Les développeurs peuvent remarquer que même si le cycle de vie de la session est défini, les anciennes données de session existent toujours longtemps. Ceci est généralement parce que session_gc () n'exécute pas chaque demande.
Analyse des causes:
Le mécanisme de recyclage de session de PHP est déclenché en fonction de la probabilité, et la configuration par défaut est la suivante:
session.gc_probability = 1
session.gc_divisor = 100
Cela signifie qu'en moyenne, une seule demande sur 100 déclenchera l'opération GC.
Solution:
Vous pouvez forcer le nettoyage en augmentant la probabilité de déclenchement GC, ou en appelant manuellement session_gc () :
ini_set('session.gc_probability', 100);
ini_set('session.gc_divisor', 100);
Ou utiliser au bon moment:
session_start();
session_gc();
Description du problème:
GC ne semble avoir aucun effet lors de l'utilisation de mécanismes de sauvegarde de session personnalisés (tels que des bases de données, Redis, etc.).
Analyse des causes:
Si la méthode GC () n'est pas correctement implémentée dans la classe SessionHandler personnalisée, les données ne seront pas réellement nettoyées lorsque PHP appelle session_gc () .
Solution:
Assurez-vous que la méthode GC () dans SessionHandlerInterface est implémentée. Par exemple, si vous utilisez MySQL pour enregistrer la session, vous pouvez l'implémenter comme ceci:
class MySessionHandler implements SessionHandlerInterface {
// ...
public function gc($max_lifetime) {
$stmt = $this->pdo->prepare("DELETE FROM sessions WHERE last_access < :time");
$stmt->execute([':time' => time() - $max_lifetime]);
return true;
}
}
Ensuite, inscrivez-vous:
$handler = new MySessionHandler();
session_set_save_handler($handler, true);
session_start();
Description du problème:
Même si Session_gc () est appelé, l'ancien fichier de session n'est toujours pas supprimé.
Analyse des causes:
Cela peut être dû au fait que session.save_path pointe le mauvais répertoire ou les autorisations insuffisantes.
Solution:
Assurez-vous que le chemin de sauvegarde correct est défini et que le processus PHP a la permission de lire et d'écrire:
ini_set('session.save_path', '/var/lib/php/sessions');
Vérifiez les autorisations du dossier:
sudo chown -R www-data:www-data /var/lib/php/sessions
sudo chmod 700 /var/lib/php/sessions
Description du problème:
L'appel Session_gc () en mode CLI (tel que les scripts de synchronisation) n'a aucun effet ou une erreur est signalée.
Analyse des causes:
L'environnement CLI ne peut pas initialiser la configuration de session correcte (telle que Save_Path est vide), ou la session n'est pas initialisée avant l'appel de l'appel.
Solution:
Assurez-vous de configurer explicitement l'environnement avant d'appeler session_gc () :
ini_set('session.save_handler', 'files');
ini_set('session.save_path', '/var/lib/php/sessions');
session_gc();
Description du problème:
Une fois que certains sites Web se déroulent longtemps, un grand nombre de fichiers .SESS sont stockés dans le répertoire / TMP , qui occupe beaucoup d'espace disque.
Analyse des causes:
Si aucun GC efficace n'est effectué pendant longtemps, ou si la fréquence GC est trop faible, ce qui entraîne le nettoyage des données historiques de session.
Solution:
Il est recommandé de configurer régulièrement un script de tâche planifié séparé et d'appeler session_gc () , par exemple, exécuter une fois par heure:
<?php
ini_set('session.save_path', '/var/lib/php/sessions');
session_gc();
Combiné avec des tâches Linux Cron:
0 * * * * /usr/bin/php /var/www/html/session_gc.php
Description du problème:
Dans l'équilibrage de charge ou l'environnement proxy inversé, différents nœuds ne synchronisent pas les données de session, ce qui entraîne un nettoyage GC incohérent.
Solution:
Il est recommandé d'utiliser un stockage de session centralisé tel que Redis ou Bases de données et d'unifier la politique GC:
ini_set('session.save_handler', 'redis');
ini_set('session.save_path', 'tcp://gitbox.net:6379');
Dans le schéma redis, le mécanisme d'expiration de Redis doit être nettoyé régulièrement ou automatiquement géré à l'aide de redis.