|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre habitué
![]() Inscription : mai 2007 Messages : 131 ![]() |
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 :
|
||
|
|
00
|
|
|
#2 |
|
Membre chevronné
![]() Inscription : novembre 2003 Messages : 737 ![]() |
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 Doit y avoir un parse error ici
__________________
http://www.ape-project.org/ |
|
00
|
|
|
#3 |
|
Membre habitué
![]() Inscription : mai 2007 Messages : 131 ![]() |
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 ... |
|
|
00
|
|
|
#4 |
|
Membre chevronné
![]() Inscription : novembre 2003 Messages : 737 ![]() |
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/ |
|
00
|
|
|
#5 |
|
Membre habitué
![]() Inscription : mai 2007 Messages : 131 ![]() |
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 ... |
|
|
00
|
|
|
#6 |
|
Membre chevronné
![]() Inscription : novembre 2003 Messages : 737 ![]() |
Tu n'as pas tout collé là ? maxlifetime, etc.. ?
Pour le parse error, regarde bien le code que tu as collé
__________________
http://www.ape-project.org/ |
|
00
|
|
|
#7 |
|
Membre habitué
![]() Inscription : mai 2007 Messages : 131 ![]() |
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"]) |
|
|
00
|
|
|
#8 |
|
Membre chevronné
![]() Inscription : novembre 2003 Messages : 737 ![]() |
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/ |
|
00
|
|
|
#9 |
|
Membre habitué
![]() Inscription : mai 2007 Messages : 131 ![]() |
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" ? |
|
|
00
|
|
|
#10 |
|
Membre habitué
![]() Inscription : mai 2007 Messages : 131 ![]() |
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 |
|
|
00
|
|
|
#11 |
|
Membre chevronné
![]() Inscription : novembre 2003 Messages : 737 ![]() |
Je te conseil de le dev direct en PHP dans ton script en stockant l'unixtime à chaque fois.
__________________
http://www.ape-project.org/ |
|
00
|
|
|
#12 |
|
Membre habitué
![]() Inscription : mai 2007 Messages : 131 ![]() |
Je l'avais déjà fait, en attendant de trouver la solution ...
|
|
|
00
|
|
|
#13 |
|
Membre chevronné
![]() Inscription : novembre 2003 Messages : 737 ![]() |
En quoi est ce génant ?
__________________
http://www.ape-project.org/ |
|
00
|
|
|
#14 |
|
Membre habitué
![]() Inscription : mai 2007 Messages : 131 ![]() |
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 ... |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com