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, 21h14   #1
Invité de passage
 
Inscription : mars 2006
Messages : 12
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 12
Points : 1
Points : 1
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 ?
blast078 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2008, 21h27   #2
Expert Confirmé
 
Avatar de Sub0
 
Homme
Inscription : décembre 2002
Messages : 3 468
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 39

Informations forums :
Inscription : décembre 2002
Messages : 3 468
Points : 3 115
Points : 3 115
Envoyer un message via MSN à Sub0 Envoyer un message via Skype™ à Sub0
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
Sub0 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2008, 21h40   #3
Invité de passage
 
Inscription : mars 2006
Messages : 12
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 12
Points : 1
Points : 1
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
blast078 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2008, 22h43   #4
Membre habitué
 
Inscription : mai 2007
Messages : 131
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 131
Points : 113
Points : 113
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 ...
zvince est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2008, 22h48   #5
Membre du Club
 
Inscription : janvier 2006
Messages : 74
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : janvier 2006
Messages : 74
Points : 69
Points : 69
Envoyer un message via MSN à {Anthony}
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 ?
{Anthony} est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/02/2008, 00h03   #6
Invité de passage
 
Inscription : mars 2006
Messages : 12
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 12
Points : 1
Points : 1
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.
blast078 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/02/2008, 01h03   #7
Expert Confirmé
 
Avatar de Sub0
 
Homme
Inscription : décembre 2002
Messages : 3 468
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 39

Informations forums :
Inscription : décembre 2002
Messages : 3 468
Points : 3 115
Points : 3 115
Envoyer un message via MSN à Sub0 Envoyer un message via Skype™ à Sub0
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...
Sub0 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/02/2008, 01h06   #8
Membre habitué
 
Inscription : mai 2007
Messages : 131
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 131
Points : 113
Points : 113
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 ...
zvince est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/02/2008, 01h09   #9
Expert Confirmé
 
Avatar de Sub0
 
Homme
Inscription : décembre 2002
Messages : 3 468
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 39

Informations forums :
Inscription : décembre 2002
Messages : 3 468
Points : 3 115
Points : 3 115
Envoyer un message via MSN à Sub0 Envoyer un message via Skype™ à Sub0
Sinon, tu peux utiliser un meta refresh ou Javascript pour actualiser la date de connexion...
Sub0 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/02/2008, 01h21   #10
Membre habitué
 
Inscription : mai 2007
Messages : 131
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 131
Points : 113
Points : 113
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 ...
zvince est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/02/2008, 01h56   #11
Membre expérimenté
 
Inscription : août 2005
Messages : 515
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 515
Points : 557
Points : 557
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 :
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.
DaRiaN est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/02/2008, 02h47   #12
Expert Confirmé
 
Avatar de Sub0
 
Homme
Inscription : décembre 2002
Messages : 3 468
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 39

Informations forums :
Inscription : décembre 2002
Messages : 3 468
Points : 3 115
Points : 3 115
Envoyer un message via MSN à Sub0 Envoyer un message via Skype™ à Sub0
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 :
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);
}
Sub0 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



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


 
 
 
 
Partenaires

Hébergement Web