Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Matthieu Napoli

blog technique
Disparition de variables de session PHP apres une redirection ?
Aujourd'hui, je viens d'apprendre quelque chose que j'ai trouvé vraiment intéressant, et surtout piégeur !

Je développe actuellement un site web tout simple avec stockage de la connexion des utilisateurs en variable de session. Seulement, j'ai remarqué des phénomènes limites paranormaux : de temps en temps, après une redirection avec la fonction PHP header(), on se retrouvait déconnecté sans raison. Et impossible de reproduire le bug à coup sur, et surtout : ça n'arrivait jamais en local.

La raison est assez simple, mais tordue (merci aux commentaires dans les fonctions PHP du site php.net !) :
Si le script A ouvre une session (pour voir si l'internaute est connecté), puis redirige avec header() vers le script B, et que le script B ouvre lui aussi rouvre la session pour voir si l'utilisateur est connecté, il peut y avoir un problème.

En effet, normalement la session PHP est refermée à la fin du script. Donc quand A redirige vers B, on fait die() (ou exit) dans A et A termine son exécution.
Mais le serveur peut être tellement rapide que le script B est déjà appelé par le navigateur client
avant même que A ait fini son exécution, et donc le serveur exécute le script B qui demande d'ouvrir la session. Il y'a donc un conflit et B (en tout cas c'est ce que j'ai constaté avec mes tests approximatifs) voit bien le tableau de session, mais celui-ci est vide. Et donc boum -> l'internaute est déconnecté.

La parade ?
Utiliser session_write_close().
Soit après en avoir finit avec la session, c'est plus sur, soit juste avant l'appel à la fonction header(). Comme ça on est certain d'avoir fini de travailler sur la session et le script B peut l'ouvrir sans problème.

PS : je pense que ça n'arrivait jamais en local car mon PC n'a pas du tout la même puissance que le serveur, bien que les temps de réponses soient bien plus infimes, mais ça n'est que mon interprétation.
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :
Posted: mardi 8 juillet 2008 21:29 par MadMatt
Classé sous : , ,

Commentaires

borbo a dit :

merci!

Très bonne info qui m'a retiré une épine du pied.

Commentaire pas très riche en information, mais c'était juste pour remercier ;-)

# juillet 26, 2008 16:57

MadMatt a dit :

Heureux que ça ait pu servir !

# juillet 26, 2008 18:20
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- [Refactoring] ReSharper pour Visual Studio 2010 (Preview) par Thomas Jaskula le il y a 2 heures et 36 minutes

- [Refactoring] Analyser vos exceptions avec ReSharper Exceptional par Thomas Jaskula le il y a 3 heures et 50 minutes

- SharePoint 2007 : patterns & practices SharePoint Guidance par Philippe Sentenac [MVP SharePoint] le il y a 17 heures et 29 minutes

- [Visual Studio 2010] Les tests cases c’est bien, mais je vais devoir tout réécrire ? par Etienne Margraff le il y a 18 heures et 26 minutes

- MVP[Gribouillon].AddYear par The Grib's Lair [Sébastien PICAMELOT - MVP SharePoint] le il y a 18 heures et 41 minutes

- Clinique INSIA - Projet de fin d’Etudes (Silverlight 3 MVVM et OutOfBrowser, WCF, TFS) - Part 1 par David REI le 07-02-2009, 23:38

- C’est la crise ? Bah pourquoi cramer du budget pub alors ? par Nix's Blog le 07-02-2009, 15:31

- Soyons MVP ! par TheSaib .NET blog le 07-02-2009, 12:15

- SharePoint : Gestion des Erreurs 6398, 7076 et 6482 par Blog Technique de Romelard Fabrice le 07-02-2009, 11:53

- EF avec WPF par Matthieu MEZIL le 07-02-2009, 10:18