Bonjour,
J’ai remarqué un problème au niveau de la gestion des sessions utilisateurs dans /tmp/sessions. Lorsque l’on a beaucoup de sessions, un cercle vicieux semble se mettre en place !
La cause du problème vient du fait que pour limiter le nombre de sessions d’un utilisateur, on est obligé d’itérer sur l’ensemble des fichiers du dossier /tmp/sessions. Plus le nombre de fichiers est important, plus cette fonction prend du temps.
Cette itération est appelée :
- à la déconnexion
- au login (2x : une fois dans verifier(), une fois dans traiter()
- autosave des formulaires
- modification de l’auteur (rappel mot de passe, changement email, nom, bio, etc.)
Au niveau du login, quand le processus prend du temps, l’interface semble ne pas réagir, il peut y avoir une attente de 2 à 30 secondes quand on a beaucoup de fichiers (dans mon cas plus de 100 000) et selon la charge serveur. Impatient, l’utilisateur re-clique sur le bouton de login, x fois, ce qui relance le login, et recrée des fichiers de session, ce qui relance l’itération qui prend du temps… J’ai l’impression que c’est la raison pour laquelle j’ai relevé une augmentation de 25000 fichiers en une dizaine de jours !)
Ne serait-ce pas l’idée développée dans le ticket #3807 ? Au sens où les clics successifs sont un peu comme une personne qui se connecte plusieurs fois sans se déconnecter.
La résolution de ce ticket a consisté (entre autre ?) à appeler la fonction qui limite le nombre de fichiers (lister_sessions_auteur) au niveau du inc/session.php:ajouter_session. Il semble que ce soit un doublon ! Dans login.php, la fonction terminer_actualiser_session appelle actualiser_session. Or actualiser_session appelle déjà lister_sessions_auteur.
Au login, on boucle donc 2 fois sur tous les fichiers de sessions !
Au-delà de cet appel double, le processus de gestion des sessions semble peu scalable. Le point épineux est lié à la volonté de limiter le nombre de fichiers de session : ne pas vouloir conserver pour l’éternité des fichiers devenus obsolètes à cause de la perte du cookie de correspondance par exemple.
Trouver le fichier de session de l’utilisateur courant est immédiat (son nom complet est transmis par le cookie).
En revanche, trouver tous les fichiers de session de l’utilisateur oblige à itérer sur l’ensemble des fichiers dans /tmp/sessions.
Cette fonction qui itère sur tous les fichiers est appelée dans de nombreux cas listés au début de ce message. Elle devrait donc être très rapide et ne pas dépendre du nombre de fichiers.
Un avis ou une remarque sur ce sujet et la bonne manière de l’aborder ?