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] Supprimer une session après une période d'inactivité [Fait]


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Inscrit en
    Mars 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 12
    Points : 6
    Points
    6
    Par défaut [Cookies] Supprimer une session après une période d'inactivité
    Bonjour,

    Je souhaiterais déconnecter un utilisateur après une période d'inactivité, disons 30 minutes par exemple, et ce, en supprimant sa session.

    J'ai regardé plusieurs fois la doc php, lu les topics de ce forum et aucune réponse claire ne me vient !

    Est-il donc impossible de détruire une session après n minutes d'inactivité de l'utilisateur ?

    J'ai essayé plusieurs changement, mais je ne suis arrivé à aucun résultat :

    - session.cookie_lifetime établit la durée de vie du cookie. Si on la fixe à 30 minutes, le cookie expire certes, mais pas après 30 minutes d'inactivité

    - session.gc_maxlifetime est a sa valeur par défaut (1440), mais aucune session n'est jamais détruite (session.gc_probability = 1, session.gc_divisor = 100)

    - session.cache_expire est à 180

    Comme je ne trouve pas de réponse sur internet, je me dis que c'est surement pas possible, mais bon, je pose quand même la question !

    Peut-on supprimer une session après n minutes d'inactivité de l'internaute ?

  2. #2
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Salut!

    Regarde si un de ces sujets ne répondrait pas à ta question :

    http://www.developpez.net/forums/sho...d.php?t=494577
    http://www.developpez.net/forums/sho...d.php?t=413841
    De retour parmis vous après 10 ans!!

  3. #3
    Futur Membre du Club
    Inscrit en
    Mars 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Salut

    Alors le premier post (que j'ai déjà lu), n'arrive à aucune conclusion sur la question.

    Pour le second, il le gère coté script, mais c'est l'utilisateur qui détruit lui même sa propre session en revenant sur la page.

    Ce que je voudrais faire, c'est détruire la session après 30 minutes d'inactivité, par exemple si l'utilisateur part déjeuner à 12h, je veux supprimer sa session vers 12h30, pas à 1h lorsqu'il revient de sa pause le midi, voire à 16h s'il ne se revient pas avant 16h. Je veux donc supprimer les sessions inactives, pas garder sa session et la supprimer pile quand il revient

  4. #4
    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
    La conclusion du premier post c'est que si on veut être sûr qu'une session expire, il faut le gérer soi-même.
    Il est possible que tu aies rencontré le même problème que moi : tu travailles (seul) sur ta machine de développement, et la session n'expire pas comme prévu. Sur un serveur de production ça ne devrait pas arriver, à moins que le site ait une audience proche de 0 : dès qu'un utilisateur accède à sa session, les autres sessions expirées sont détruites (enfin, ça dépend du rapport session.gc_probability/session.gc_divisor).
    Si on veut que la suppression des sessions expirées se fasse sans aucune connexion d'utilisateur, il faut planifier une tâche pour faire le nettoyage ...

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 74
    Points : 81
    Points
    81
    Par défaut
    Bonsoir,

    Ce que tu souhaites n'est pas possible, du moins pas à ma connaissance.
    Les sessions étant stocké côté serveur, je vois mal celui-ci allez regarder
    à chaque seconde si une de ses sessions n'a pas expiré.

    Et puis je vois mal l'intérêt, quel est le problème de regarder lorsque l'utilisateur tente d'accéder au site l'heure de sa dernière action et comparer cette dernière à l'heure actuelle et de le virer si besoin ?

  6. #6
    Futur Membre du Club
    Inscrit en
    Mars 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Il s'agit d'un serveur en prod avec 800 utilisateurs par jours, donc non, ca n'est pas le problème

    @antony : sous les distributions debian, un cron se charge de purger les sessions. Il n'y va pas à chaque seconde heureusement ! Sur ma machine, il passe toutes les demi-heure.

    Sinon, pour répondre à ta question, j'ai pas mal d'utilisateurs qui dorment avec leur PC allumé, et qui se reconnecte le lendemain avec la session de la veille. Je ne souhaite pas garder ses sessions aussi longtemps.

  7. #7
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Citation Envoyé par {Anthony} Voir le message
    Ce que tu souhaites n'est pas possible, du moins pas à ma connaissance.

    Plusieurs solutions existent d'après moi :

    • Tu peux enregistrer la date de connexion dans une variable de session -> $_SESSION['date_log']. Ensuite, tu compares cette date avec la date courante pour obtenir la durée déjà écoulée...

    • Tu peux utiliser le même principe, mais avec une base de données pour stocker la date...

    • Une autre solution consiste à récupérer le chemin des fichiers de sessions avec la fonction session_save_path() et scanner ce dossier à la recherche du fichier portant le nom du SID du client. Puis comparer la date de ce fichier avec la fonction filemtime...
    De retour parmis vous après 10 ans!!

  8. #8
    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
    Si les sessions sont purgées avec la cron, une session ne devrait pas exister le lendemain ...
    Pour "améliorer", il suffit de faire tourner la cron plus souvent : 800/ jour, sur une base de 10h/jour, ça fait 80 utilisateurs connectés sur une heure. Bon, un utilisateur peut voir 10 pages avant de s'endormir, mais ça fait toujours que 80 sessions ...
    La tâche cron doit durer 5s max. Fais la tourner toutes les 5 mn. Au pire (si le front du gars heurte la touche entrée quand il s'endort et que la cron passe juste après) ça fera 35 mn ...

    Edit : Sub0 : Blast078 ne veut pas que la session soit purgée sur action de l'utilisateur, mais automatiquement ...

  9. #9
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Sinon, tu peux utiliser un meta refresh ou Javascript pour actualiser la date de connexion...
    De retour parmis vous après 10 ans!!

  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
    Je viens de relire le 1er post : si c'est une tâche cron qui purge les sessions, quel rapport avec les session.cookie_lifetime, session.gc_probability ou session.gc_divisor ? c'est une tâche prédéfinie crée à l'install de php (je ne connais pas linux) ou un script perso ? si c'est un script perso il devrait supprimer tous les fichiers de session plus vieux que session.gc_maxlifetime, sans tenir compte du reste ...

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 514
    Points : 631
    Points
    631
    Par défaut
    Bonsoir,
    je me range à l'avis de Sub0 et je coderais un petit script PHP à mettre en tâche planifiée (crontab sous unix), toutes les 30 minutes.

    Pour mettre un petit exemple schématique à la méthode de Sub0 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <?php
     
      $limite = 30; // 30 minutes
     
      $chemin = session_save_path();
      $repertoire = dir($chemin);
      $maintenant = time();
     
      while (($entree = $repertoire->read()) !== FALSE)
      {
     
        $lien = $chemin.'/'.$entree;
     
        if (is_file($lien))
         if ($modification = filemtime($lien))	 
          if (($maintenant-$modification) > ($limite*60)) unlink($lien);
     
      }
     
      $repertoire->close();
     
    ?>
    Cordialement,
    DaRiaN.

  12. #12
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Perso, je lance ce genre de nettoyage (ramasse miette) à chaque fois qu'un utilisateur se connecte. Cela m'évite de devoir utiliser une planification de type cron.

    ps: Pour la suppression du fichier, penser éventuellement à redéfinir les droits avant d'utiliser unlink :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function myunlink($file){
      @chown($file,'root');
      @chgrp($file,'root');
      @chmod($file,0777);
      @unlink($file);
      return !file_exists($file);
    }
    De retour parmis vous après 10 ans!!

Discussions similaires

  1. Afficher une recherche après une sélection dans une ListBox
    Par vitalus dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 25/05/2015, 18h04
  2. Réponses: 4
    Dernier message: 15/10/2009, 13h33
  3. Réponses: 0
    Dernier message: 30/09/2009, 18h42
  4. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 13h35
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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