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 18/01/2012, 11h50   #1
Membre du Club
 
Homme jean
Inscription : octobre 2011
Messages : 95
Détails du profil
Informations personnelles :
Nom : Homme jean
Localisation : France, Corse (Corse)

Informations forums :
Inscription : octobre 2011
Messages : 95
Points : 52
Points : 52
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 :
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.
dev14 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 12h32   #2
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 727
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 727
Points : 3 294
Points : 3 294
Salut

Fais un essai avec ceci pour voir :
Code :
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é.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 13h05   #3
Membre Expert
 
Avatar de ska_root
 
Homme
Développeur informatique
Inscription : août 2005
Messages : 1 179
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 42
Localisation : France

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

Informations forums :
Inscription : août 2005
Messages : 1 179
Points : 1 580
Points : 1 580
Bonjour,

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

Code :
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 :
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 :
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();
}
__________________
http://cdemarche.developpez.com/

Tu as la réponse à ta question ? N'oublies pas le petit en bas à gauche de ton message...
ska_root est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 13h38   #4
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 727
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 727
Points : 3 294
Points : 3 294
@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.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 15h47   #5
Membre du Club
 
Homme jean
Inscription : octobre 2011
Messages : 95
Détails du profil
Informations personnelles :
Nom : Homme jean
Localisation : France, Corse (Corse)

Informations forums :
Inscription : octobre 2011
Messages : 95
Points : 52
Points : 52
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 :
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
dev14 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 16h15   #6
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 727
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 727
Points : 3 294
Points : 3 294
Citation:
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).


Citation:
Est ce que le fait d'utiliser
Code :
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 :
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.


Citation:
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).
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 16h40   #7
Membre du Club
 
Homme jean
Inscription : octobre 2011
Messages : 95
Détails du profil
Informations personnelles :
Nom : Homme jean
Localisation : France, Corse (Corse)

Informations forums :
Inscription : octobre 2011
Messages : 95
Points : 52
Points : 52
Non je ne les avais pas bien redéfinis désolé.

Dans le php.ini ils disent ceci :

Code :
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?
dev14 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 18h59   #8
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 727
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 727
Points : 3 294
Points : 3 294
Citation:
ç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 :
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).
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 21h47   #9
Membre Expert
 
Avatar de ska_root
 
Homme
Développeur informatique
Inscription : août 2005
Messages : 1 179
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 42
Localisation : France

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

Informations forums :
Inscription : août 2005
Messages : 1 179
Points : 1 580
Points : 1 580
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 :
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...

__________________
http://cdemarche.developpez.com/

Tu as la réponse à ta question ? N'oublies pas le petit en bas à gauche de ton message...
ska_root est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2012, 09h22   #10
Membre du Club
 
Homme jean
Inscription : octobre 2011
Messages : 95
Détails du profil
Informations personnelles :
Nom : Homme jean
Localisation : France, Corse (Corse)

Informations forums :
Inscription : octobre 2011
Messages : 95
Points : 52
Points : 52
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
dev14 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h40.


 
 
 
 
Partenaires

Hébergement Web