Précédent   Forum des professionnels en informatique > PHP > Langage > Sessions
Sessions Forum d'entraide sur les sessions avec PHP. Avant de poster -> FAQ sessions, Cours sessions et Sources sécurité
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/02/2008, 00h29   #1
Membre habitué
 
Inscription : mai 2007
Messages : 131
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 131
Points : 113
Points : 113
Par défaut [Cookies] Session qui n'expire pas comme prévu

Bonjour
J'ai des sessions qui expirent de façon aléatoire. Le plus souvent à la fermeture du navigateur, comme prévu par session.cookie_lifetime = 0, sauf que j'ai aussi session.gc_maxlifetime = 300, et que j'aimerais bien que ça expire au bout de 300s d'inactivité.
J'ai mis session.gc_divisor = 1 pour que le ramassage d'ordures (garbage collection) soit exécuté à chaque accès à une session : pas de changement.

Par contre, j'ai constaté ce soir que des informations avaient disparu dans le dossier session.save_path au bout d'environ 3/4h pendant que je faisais autre chose, alors qu'elles étaient toujours là au bout des 5mn. Quelqu'un avait tenté d'accéder à une page qui gère les sessions dans un autre répertoire.
Alors j'ai fait un test : ouvrir une session avec Firefox. Attendre les 5 mn : session pas expirée. J'ouvre une session dans un autre répertoire avec IE, et hop, ma 1e session disparait ! mais ça ne marche pas à tous les coups ...

Je ne vois pas trop où chercher ...
Je mets un bout de code des fois que ça viendrait de là.
Une idée ?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
// création de la session après login
if (!isset($_SESSION)) session_start();
$_SESSION["var1"] = "toto";
 
// contrôle de session, dans une autre page
if (!isset($_SESSION)) session_start();
if (!isset($_SESSION["var1"])
{
message disant que pour la session a expiré
exit;
 
// j'ai aussi testé session_start() sans if (!isset($_SESSION))
}
zvince est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2008, 00h35   #2
Membre chevronné
 
Avatar de |PaRa-BoL
 
Inscription : novembre 2003
Messages : 737
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : novembre 2003
Messages : 737
Points : 782
Points : 782
Salut,

Déja le isset() tu peux le virer. $_SESSION est crée lors du session_start().

Pour le raport avec IE/FF cela me parait louche, les cookies sont totalement différents, il ne peux donc y avoir aucune interaction.

Peux tu être plus claire dans ton problème

Code :
1
2
3
 
if (!isset($_SESSION["var1"])
{
Doit y avoir un parse error ici
__________________
http://www.ape-project.org/
|PaRa-BoL est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2008, 00h45   #3
Membre habitué
 
Inscription : mai 2007
Messages : 131
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 131
Points : 113
Points : 113
Merci de ta réponse.
Non je n'ai pas de parse error.
En fait, les données de session ne sont pas supprimées sur le serveur, et la session n'expire pas.
Je peux forcer l'expiration en ouvrant le fichier de sauvegarde de session dans le dossier session.save_path avec le bloc note et en supprimant le contenu (donc les variables de sessions). La session existe toujours, mais plus aucune variable.
Par contre, si j'attends que le serveur le fasse tout seul, ça marche quand ça veut ...
zvince est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2008, 00h53   #4
Membre chevronné
 
Avatar de |PaRa-BoL
 
Inscription : novembre 2003
Messages : 737
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : novembre 2003
Messages : 737
Points : 782
Points : 782
Pas de parse error avec le code que tu as collé, je vois pas trop comment c'est possible.

Colle toute ta config PHP concernant les sessions.
Quelle version de PHP, quel OS ?
__________________
http://www.ape-project.org/
|PaRa-BoL est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2008, 01h04   #5
Membre habitué
 
Inscription : mai 2007
Messages : 131
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 131
Points : 113
Points : 113
parse error, je ne vois pas pourquoi, la syntaxe est correcte ... ah oui, il manque une parenthèse, c'est le copier coller ...
Je tourne sous XP pro SP2, Apache 2.061, PHP 5.20
Config des session :
session.save_path="D:\PHPTemp\session"
session.save_handler = files
session.use_cookies = 1
session.use_only_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.cookie_httponly =
session.serialize_handler = php
session.gc_probability = 1
session.gc_divisor = 1
session.bug_compat_42 = 0
session.bug_compat_warn = 1
session.entropy_length = 0
session.entropy_file =
session.cache_limiter = nocache
session.cache_expire = 5
session.use_trans_sid = 0
session.hash_function = 0
session.hash_bits_per_character = 5

je viens de refaire un test : j'édite le fichier de sauvegarde de session, je fais sauter la variable que je contrôle => session expirée. je remets la variable dans le fichier => session retrouvée ...
zvince est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2008, 01h09   #6
Membre chevronné
 
Avatar de |PaRa-BoL
 
Inscription : novembre 2003
Messages : 737
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : novembre 2003
Messages : 737
Points : 782
Points : 782
Tu n'as pas tout collé là ? maxlifetime, etc.. ?

Pour le parse error, regarde bien le code que tu as collé La syntaxe c'est pas bonne
__________________
http://www.ape-project.org/
|PaRa-BoL est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2008, 01h13   #7
Membre habitué
 
Inscription : mai 2007
Messages : 131
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 131
Points : 113
Points : 113
exact, oublié
session.gc_maxlifetime = 300
pour le parse error, oui, il manque une parenthèse à droite. c'est normal, en fait mon test est plus long :
Code :
if (!isset($_SESSION["nomuse"]) || $sess_exp == "Y" || $var_domain != $_SERVER["SERVER_NAME"])
la variable $sess_exp c'est une astuce que j'ai trouvé pour contourner le problème, je mets la date/heure d'expiration prévue dans une variable de session ...
zvince est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2008, 01h18   #8
Membre chevronné
 
Avatar de |PaRa-BoL
 
Inscription : novembre 2003
Messages : 737
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : novembre 2003
Messages : 737
Points : 782
Points : 782
Ma configuration est sensiblement la même que la tienne et je n'ai pas de soucis.
A la seul différence que tout est sous Linux.
__________________
http://www.ape-project.org/
|PaRa-BoL est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2008, 01h20   #9
Membre habitué
 
Inscription : mai 2007
Messages : 131
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 131
Points : 113
Points : 113
Et avant je tournais avec Windows 2000 pro, et il me semble que je n'avais pas ce problème ...
Edit : Il n'y aurait pas moyen de tracer toute l'activité php, pour voir si le process gc se déclenche, ou si il plante ?
Edit2 : Après d'autres tests il semble se confirmer que :
1) accéder à une session après expiration théorique ne fait rien (en tout cas pas pour la session en cours, qui n'expire pas malgré session.gc_maxlifetime)
2) accéder à une autre session, par exemple avec un autre navigateur, déclenche le nettoyage des sessions expirées
3) sans accès à une session, le gc ne nettoie pas les données de session sur le serveur
Un cookie a-t-il priorité sur les variables de session stockées sur le serveur ? un lien avec variables_order = "GPCS" ?
zvince est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2008, 14h59   #10
Membre habitué
 
Inscription : mai 2007
Messages : 131
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 131
Points : 113
Points : 113
Après recherche sur google et relecture de la doc php sur les sessions, il semble que ce soit normal. Voir le dernier commentaire tout en bas (19/08/2000) :
http://www.php.net/session
Extrait : "It appears that session file garbage collection occurs AFTER the current session is loaded"
En clair, si on est seul sur un serveur, comme une machine de développement, une session n'expire jamais, parceque la session en cours est "rafraichie" avant le nettoyage. Bien sûr ce n'est pas censé arriver sur un serveur de production ...
Il faut donc le gérer soi-même, avec une variable date/heure ou timestamp à contrôler à chaque accès à la session. Ou planifier un script.
Quelqu'un peut le confirmer ? (il faut être seul sur un serveur)

edit : exemple de contrôle de session avec un timstamp : http://www.php.net/manual/fr/ref.session.php#74865
zvince est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2008, 15h12   #11
Membre chevronné
 
Avatar de |PaRa-BoL
 
Inscription : novembre 2003
Messages : 737
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : novembre 2003
Messages : 737
Points : 782
Points : 782
Je te conseil de le dev direct en PHP dans ton script en stockant l'unixtime à chaque fois.
__________________
http://www.ape-project.org/
|PaRa-BoL est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2008, 15h14   #12
Membre habitué
 
Inscription : mai 2007
Messages : 131
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 131
Points : 113
Points : 113
Je l'avais déjà fait, en attendant de trouver la solution ...
zvince est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2008, 15h20   #13
Membre chevronné
 
Avatar de |PaRa-BoL
 
Inscription : novembre 2003
Messages : 737
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : novembre 2003
Messages : 737
Points : 782
Points : 782
En quoi est ce génant ?
__________________
http://www.ape-project.org/
|PaRa-BoL est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2008, 15h27   #14
Membre habitué
 
Inscription : mai 2007
Messages : 131
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 131
Points : 113
Points : 113
Ce n'est pas gênant, ça fait 3 ou 4 lignes de code, mais je pensais que les sessions expiraient toutes seules, et que j'avais un bug sur mon serveur ... En ColdFusion le nettoyage est fait par un script planifié, et on n'a pas à le gérer ...

Edit : en conclusion, on dira que quand on veut que ça marche comme prévu, il vaut mieux le gérer soi-même, et pas espérer que ça se fera tout seul ...
zvince est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h16.


 
 
 
 
Partenaires

Hébergement Web