IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Cookies] Session qui n'expire pas comme prévu [Fait]


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 131
    Points : 132
    Points
    132
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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))
    }

  2. #2
    Membre éclairé Avatar de |PaRa-BoL
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 738
    Points : 876
    Points
    876
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if (!isset($_SESSION["var1"])
    {
    Doit y avoir un parse error ici

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 131
    Points : 132
    Points
    132
    Par défaut
    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 ...

  4. #4
    Membre éclairé Avatar de |PaRa-BoL
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 738
    Points : 876
    Points
    876
    Par défaut
    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 ?

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 131
    Points : 132
    Points
    132
    Par défaut
    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 ...

  6. #6
    Membre éclairé Avatar de |PaRa-BoL
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 738
    Points : 876
    Points
    876
    Par défaut
    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

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 131
    Points : 132
    Points
    132
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ...

  8. #8
    Membre éclairé Avatar de |PaRa-BoL
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 738
    Points : 876
    Points
    876
    Par défaut
    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.

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 131
    Points : 132
    Points
    132
    Par défaut
    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" ?

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 131
    Points : 132
    Points
    132
    Par défaut
    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

  11. #11
    Membre éclairé Avatar de |PaRa-BoL
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 738
    Points : 876
    Points
    876
    Par défaut
    Je te conseil de le dev direct en PHP dans ton script en stockant l'unixtime à chaque fois.

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 131
    Points : 132
    Points
    132
    Par défaut
    Je l'avais déjà fait, en attendant de trouver la solution ...

  13. #13
    Membre éclairé Avatar de |PaRa-BoL
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 738
    Points : 876
    Points
    876
    Par défaut
    En quoi est ce génant ?

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 131
    Points : 132
    Points
    132
    Par défaut
    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 ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Mission qui ne se passe pas comme prévu
    Par gueulederack dans le forum Emploi
    Réponses: 17
    Dernier message: 10/11/2011, 17h00
  2. Trigger qui ne s'execute pas comme prévu
    Par bringer dans le forum SQLite
    Réponses: 2
    Dernier message: 16/11/2009, 21h54
  3. Filtrage au niveau de la requête qui ne fonctionne pas comme prévu
    Par hartecel dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 25/06/2008, 14h06
  4. [Bonne pratique] merge qui ne fonctionne pas comme prévu
    Par forex dans le forum Subversion
    Réponses: 1
    Dernier message: 19/05/2008, 04h28
  5. Réponses: 5
    Dernier message: 21/12/2006, 19h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo