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 :

Faire des sessions de 15 mn et déconnecter automatiquement la personne


Sujet :

Langage PHP

  1. #1
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2011
    Messages : 354
    Points : 410
    Points
    410
    Par défaut Faire des sessions de 15 mn et déconnecter automatiquement la personne
    Bonjour, je réfléchissais à un code pour déconnecter toute personne au bout d'un certain temps, 15mn par exemple.

    Je voudrais que toutes ses données soient supprimées.

    Je me suis renseigné, et voici le code :

    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
     
    		$time_session=10;
    		session_set_cookie_params($time_session);
    		// ini_set('session.gc_maxlifetime', $time_session);
    		session_start();
     
    		if(!isset($_SESSION['time']) || !isset($_SESSION['session_id']){
    			$_SESSION['session_id'] = uniqid();
    			$_SESSION['time'] = time()+$time_session;
    		}
    		else if($_SESSION['time']-time()<=0){
    			session_destroy();
    			unset($_SESSION['session_id']);
    			unset($_SESSION['time']);
    		}
    Mais je ne sais pas si c'est bien, ça a l'air de fonctionner.

  2. #2
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Salut

    Fais un essai avec ceci pour voir :
    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
    <?php
    ini_set('session.name', 'MA_SESSION');
    ini_set('session.cookie_path', '/');
    ini_set('session.cookie_domain', 'localhost');
    ini_set('session.gc_maxlifetime', 60);
    ini_set('session.cookie_lifetime', 60);
    session_start();
    ?>
     
    <html>
    ... etc ...
     
    session_id() : <?php echo session_id(); ?>;<br />
     
    </html>
    Théoriquement ça devrait fonctionner. (j'ai mis 1 minutes, histoire de faire court)
    Théoriquement toujours, il faut que le "gc_maxlifetime" et le "cookie_lifetime" soit synchro pour que ça fonctionne sans devoir redéfinir sans cesse le cookie avec session_set_cookie_params.
    Il faut aussi bien définir le "cookie_path" et le "cookie_domain", sinon il risque d'avoir des problèmes.


    Cependant, il faut savoir que le fichier de session n'est pas physiquement supprimé, c'est juste sa date qui est périmée.
    C'est le "ramasse miette" (GC -> Garbage Collector) qui se charge de le détruire selon une certaine probabilité.

  3. #3
    Membre chevronné
    Avatar de ska_root
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    1 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Août 2005
    Messages : 1 203
    Points : 1 839
    Points
    1 839
    Par défaut
    Bonjour,

    J'utilise pratiquement la même méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // exemple pour une session de 15mn
    session_start();
    if (!isset($_SESSION['time'])) {
        $_SESSION['time'] = time();
    } else if (time() - $_SESSION['time'] > 900) {
        $_SESSION= array();
        session_regenerate_id(true);
        $_SESSION['time'] = time();
    }
    mais cela ne fait que de "rafraîchir" la session en cours... si tu veux jeter l'utilisateur il faut inclure une condition en plus, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // exemple sur la page de login 
    session_start();
    if(isset($_SESSION['logged'])) {
      header('Location: index.php');
      exit();
    } else {
       if(utilisateurEstReconnu()) { // methode d'authentification
         $_SESSION['time']= time();
         $_SESSION['logged']= true;
         header('Location: index.php');
         exit();
    }
    ...
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // sur les autres pages
    session_start();
    if(
           empty($_SESSION['logged']) || 
           empty($_SESSION['time']) || 
           (time() - $_SESSION['time']) > 900) {
      $_SESSION= array();
      session_regenerate_id(true);
      header('Location: login.php');
      exit();
    }

  4. #4
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    @ska_root
    Ne peut on pas considérer qu'en procédant ainsi (de mettre une heure de référence dans sa session) on ne ferait que refaire ce que la gestion des session/cookie propose déjà ?
    Ou alors, ne peut pas voir cela comme un moyen détourné par rapport à ce qui existe à ce niveau ?

    En tout cas, si le délai qu'on met dans la session à une valeur inférieur à celle défini dans le gc_maxlifetime (1440s, soit 24 minutes par défaut), ça fonctionnera.
    Mais si on met un délai plus grand, à mon avis ça ne devrait pas fonctionner, une nouvelle session sera créé si ça dépasse 24 minutes. Du moins il me semble.


    Php le propose déjà, c'est la date de création ou de modification et un temps de référence qui est défini dans le gc_maxlifetime.
    Donc quelque part l'information on l'a déjà.


    Donc normalement 2 choses une :
    - Soit on modifie les config que propose Php à ce niveau pour qu'une nouvelle session soit créé si la date est expirée (gc_maxlifetime et cookie_lifetime).

    - Soit avant de démarrer la session (avant session_start) on parcourt chaque fichier de session, on récupère la date de dernière mise à jour du fichier de session correspondant (grâce au cookie), et si la date est expirée, alors on supprime le fichier, puis on lance la session (session_start). Une nouvelle session devrait être créé.


    Ceci dit, pourquoi pas.

  5. #5
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2011
    Messages : 354
    Points : 410
    Points
    410
    Par défaut
    Bonjour,

    à RunCodePhp

    sur ton exemple, à l'exécution de ton code, j'ai session_id() qui génère un identifiant à chaque rafraîchissement de la page. Ne devait-il pas le faire au bout d'une minute?

    à ska_root, merci pour ton exemple, c'est intéressant.

    à RunCodePhp pour son second message, je pense aussi que Php gère déjà tout ça, mais si je modifie gc_maxlifetime dans le .ini, toutes mes applications seront soumises à ça.

    Est ce que le fait d'utiliser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ini_set('session.gc_maxlifetime', 900);
    peut être une solution? Si j'ai bien compris, ça tue la session à 900 secondes?

    Sinon pour ton dernier point, il est intéressant, mais va-t-on chercher ce dernier fichier dans le dossier des fichiers temporaires, des cookies? Est ce que le traitement à faire ne serait pas trop lourd?

    Merci

  6. #6
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    sur ton exemple, à l'exécution de ton code, j'ai session_id() qui génère un identifiant à chaque rafraîchissement de la page. Ne devait-il pas le faire au bout d'une minute?
    Oui, au bout d'une minute.
    Si ça ne fonctionnementpas, alors il doit avoir un souci au niveau du path ou du domaine coté cookie.
    Les as tu correctement bien défini ?
    (de mon coté j'avais fais un essai juste avant, histoire de me remémoré, et ça fonctionne).

    As tu essayé en faisant ça du plus basique possible (histoire de ne pas être perturbé par d'autres codes).


    Est ce que le fait d'utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ini_set('session.gc_maxlifetime', 900);
    peut être une solution? Si j'ai bien compris, ça tue la session à 900 secondes?
    C'est plutôt ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ini_set('session.gc_maxlifetime', 900);
    ini_set('session.cookie_lifetime', 900);
    C'est le couple des 2 qui fait que ça marche.
    L'un est plus destiné coté serveur, l'autre coté client (session/cookie), ça marche de pair.
    Et il faut que le temps soit le même aussi.


    Sinon pour ton dernier point, il est intéressant, mais va-t-on chercher ce dernier fichier dans le dossier des fichiers temporaires, des cookies? Est ce que le traitement à faire ne serait pas trop lourd?
    Le mieux est de créer un répertoire pour les sessions dans ton espace serveur, et qu'il soit en-dehors du répertoire du serveur web (en-dehors de www), question de sécurité.
    Suffit de le définir dans session.save_path.

    Si tu prends cette voie là, regarde la doc sur la gestion personnalisée des sessions : session_set_save_handler().
    A savoir qu'on peu aussi gérer les session dans une Bdd au lieu dans des fichiers (par défaut).

  7. #7
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2011
    Messages : 354
    Points : 410
    Points
    410
    Par défaut
    Non je ne les avais pas bien redéfinis désolé.

    Dans le php.ini ils disent ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ; NOTE: If you are using the subdirectory option for storing session files
    ;       (see session.save_path above), then garbage collection does *not*
    ;       happen automatically.  You will need to do your own garbage
    ;       collection through a shell script, cron entry, or some other method.
    ;       For example, the following script would is the equivalent of
    ;       setting session.gc_maxlifetime to 1440 (1440 seconds = 24 minutes):
    ;          cd /path/to/sessions; find -cmin +24 | xargs rm
    ça veut dire que le garbage collector ne fonctionnera pas? je ne comprends pas la dernière ligne cd /path...

    Est ce qu'on doit nous même tout supprimer par un script?

  8. #8
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    ça veut dire que le garbage collector ne fonctionnera pas?
    Le garbage collector est un mécanisme du système, tu ne le contrôle pas vraiment, car il ne se déclenche pas à chaque fois, mais selon des probabilités.
    Ceci dit, on peu redéfinir ces probabilités afin de le faire déclencher plus ou moins souvent.
    Dans le php.ini : session.gc_probability et session.gc_divisor
    Cependant faut pas se tromper, au risque à ce que les fichiers ne soient pas supprimés (prudence quoi).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    je ne comprends pas la dernière ligne cd /path...
    cd est une commande pour se déplacer dans les répertoires.
    Puis /path/to/sessions c'est pour exemple, c'est à dire : chemin/vers/le/repertoire/de/session
    C'est juste des explications pour exemple.
    C'est à toi de créer ce répertoire, est d'indiquer le chemin où il se trouve sur le disque (session.save_path).

  9. #9
    Membre chevronné
    Avatar de ska_root
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    1 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Août 2005
    Messages : 1 203
    Points : 1 839
    Points
    1 839
    Par défaut
    Désolé d'arriver un peu tard dans le thread...

    Citation Envoyé par RunCodePhp Voir le message
    ...on ne ferait que refaire ce que la gestion des session/cookie propose déjà ?
    je suis d'accord mais bon nombre de serveurs mutualisés ne permettent pas la gestion personnalisée des sessions et/ou limitent l'utilisation de ini_set(). C'est une solution de contournement.

    La configuration par défaut de php stocke les fichiers de session dans le répertoire /tmp, celui-ci peut subir des règles d'effacement définit par l'OS qui les héberge. C'est pourquoi j'ajouterais qu'il faut définir session.save_path en plus de session.gc_maxlifetime et session.cookie_lifetime

    En ce qui concerne le garbage collector, il est effectivement enclenché suivant une probabilité définit par la règle session.gc_probability (1 par défaut) divisée par session.gc_divisor (100 par défaut). Donc en fait, ce n'est pas qu'il ne fonctionne pas, mais si on conserve ces valeurs par défaut, il ne se déclenchera qu'avec une probabilité de 1%. On peut donc jouer avec les valeurs par défaut mais d'après ce que je comprends, cela coutera aussi plus cher en terme de processus car lorsqu'il se déclenche il doit vérifier la validité de toutes les sessions enregistrées.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cd /path/to/sessions; find -cmin +24 | xargs rm
    cd => change directory (va dans le répertoire de stockage des fichiers de session)
    find => cherche tous les fichiers de manière récursive dans le répertoire courant
    l'option -cmin +24 => filtre les fichiers non modifiés depuis 24 minutes
    le "|" indique qu'on donne la liste des fichiers obtenus a la commande suivante
    xargs => itère les résultat est les donne en arguments a la commande suivante
    rm => supprime le fichier

    voila pour la petite histoire...


  10. #10
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2011
    Messages : 354
    Points : 410
    Points
    410
    Par défaut
    Je vous remercie.

    la dernière ligne, c'était surtout pour l'exemple que pour les commandes cd ou find, mais merci.

    bonne journée

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

Discussions similaires

  1. Déconnecter des sessions actives
    Par ninouchfis dans le forum MS SQL Server
    Réponses: 11
    Dernier message: 10/07/2012, 11h34
  2. Réponses: 6
    Dernier message: 21/04/2007, 20h08
  3. Faire un compteur pour des sessions utilisateurs
    Par liverbird dans le forum C++Builder
    Réponses: 55
    Dernier message: 21/06/2006, 15h37
  4. Réponses: 8
    Dernier message: 18/09/2002, 03h20

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