Question Session : réaction incompréhensible

__Damien__
Invité n'ayant pas de compte PHPfrance

09 juin 2008, 15:24

Bonjour à vous tous !

Je viens solliciter l'aide des plus calés d'entre vous sur les sessions car, je suis confronté à une situation que je ne comprends pas du tout.

Sur chacune des pages de mon site j'utilise les sessions, en haut de chaque page j'ai donc un session_start();

Tout se passe bien sauf que sans aucune raison la session est parfois perdue lors de la navigation et le visiteur se retrouve alors déconnecté.
Il n'y a aucune logique, parfois la déconnexion intervient au bout de 10 minutes ou de 15 minutes.
En tout cas normalement à chaque changement de page, le compteur devrait repartir à 0 et pour 24 minutes avec ma configuration, mais il n'en est rien.

Voici la configuration de mon php.ini :

Code : Tout sélectionner

session.auto_start On On session.bug_compat_42 On On session.bug_compat_warn On On session.cache_expire 180 180 session.cache_limiter nocache nocache session.cookie_domain no value no value session.cookie_lifetime 1440 1440 session.cookie_path / / session.cookie_secure Off Off session.entropy_file no value no value session.entropy_length 0 0 session.gc_divisor 1 1 session.gc_maxlifetime 1440 1440 session.gc_probability 1 1 session.name PHPSESSID PHPSESSID session.referer_check no value no value session.save_handler files files session.save_path /tmp /tmp session.serialize_handler php php session.use_cookies On On session.use_only_cookies Off Off session.use_trans_sid Off Off
Merci d'avance pour votre aide :)

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

09 juin 2008, 23:38

Voici, les valeurs par défaut en ce qui concerne le paramétrage des sessions et leurs durées de vie :
(Extrait de PHP.INI)

Code : Tout sélectionner

; Chemin des fichiers de sessions sur le serveur session.save_path = "/tmp" ; Utiliser les cookies (1 = Oui ou 0 = Non) session.use_cookies = 1 ; Nom par défaut de la session/cookie session.name = PHPSESSID ; intialiser la session quand la requête démarre (1 = Oui ou 0 = Non) session.auto_start = 0 ; Durée de vie du cookie en secondes, 0 = jusqu'à redémarrage du navigateur. session.cookie_lifetime = 0 ; Après ce nombre de secondes, les données enregistrées dans les sessions seront concidérées ; comme 'garbage' (fichiers à supprimer) et seront effectivement supprimées par le processus ; "garbage collection process" (ramasse miettes). session.gc_maxlifetime = 1440 ; Probabilité de suppression des données de session par le processus ramasse miettes ; par défaut : 1/1000 session.gc_probability = 1 session.gc_divisor = 1000 ; Méthode HTTP d'usage du cache session {nocache, private, public,} ; à laisser vide pour permettre l'envoi d'entêtes http anti-cache. ; par défaut : pas de cache session.cache_limiter = nocache ; Tout document expire du cache après n minutes. session.cache_expire = 180

Bonne lecture et comparaison :wink: On pourrait en discuter après ...
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

__Damien__
Invité n'ayant pas de compte PHPfrance

10 juin 2008, 01:39

Salut sadeq,

Merci pour ton aide, je viens de faire passer le session.gc_divisor à 1000, je ne sais pas si cela va arranger le problème.

En tout cas, mon but est de faire en sorte que le visiteurs possède une session de 24 minutes à chaque changement de page. En gros s'il reste plus de 24 minutes sur une page, il perd sa session, mais s'il reste 23 minutes sur une page et qu'il change de page, la session repart pour 24 minutes.

Merci encore pour votre aide

Mammouth du PHP | 965 Messages

10 juin 2008, 10:01

Salut sadeq,

Merci pour ton aide, je viens de faire passer le session.gc_divisor à 1000, je ne sais pas si cela va arranger le problème.

En tout cas, mon but est de faire en sorte que le visiteurs possède une session de 24 minutes à chaque changement de page. En gros s'il reste plus de 24 minutes sur une page, il perd sa session, mais s'il reste 23 minutes sur une page et qu'il change de page, la session repart pour 24 minutes.

Merci encore pour votre aide

Il me semble qu'avec les paramètres de base, la session dure une vingtaine de minutes.

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

10 juin 2008, 15:59

Bonjour,

En fait notre ami souhaite réinitialiser la durée de vie de la session à chaque consultation de page si la durée de la dernière consultation n'a pas dépassé 24 mn.

Ce qui sous-entend que la gestion de la durée de vie ici doit être personnalisée. Je suggère alors une solution PHP de gestion perso de session.

Voici l'idée:
  • On paramètre la session pour une navigation illimitée (par défaut : fin de navigateur)
    On active la session pour toutes les pages surveillées.
    La première fois, on note le temps d'accès à la 1° page dans une variable globale de la session.
    Lorsque l'utilisateur navigue d'une page en ouvrant une autre, on calcule la durée de consultation de la dernière page en utilisant le dernier temps d'accès enregistré. Et si la durée (24 mn) est dépassée, la session doit être détruite sinon, la session reste intacte et le temps d'accès est réinitialisé dans la session.
    On répété ce mécanisme pour toutes les pages de session.
Voici ce que ça donne en PHP : un bloc de code à insérer au début de toutes les pages de session.
<?php
/*******************************************************************************************************
* DEBUT DE TRAITEMENT DE LA DUREE DE VIE DE LA SESSION
* ******************************************************************************************************
* Objectif : Personnaliser la gestion de la durée de vie d'une session de la façon suivante :
*  1. Le temps de consultation d'une page est limité à N secondes bien définies
*  2. Quand la règle n°1 est respectée, la session doit être conservée durant toute la navigation
*     Sinon, la session est détruite.
*
* Paramètres :
*  DUREE_AUTORISEE_ENTRE_2_PAGES : (constante) représente la durée autorisée par la règle n°1
*  DERNIER_ACCES : (variable globale de session) représente dans la page actuel, le temps où une page 
* 				précédente a été accédée. Ce paramètre permet de calculer le temps écoulée entre 2 pages
* 				Ainsi, si cette durée calculée est supérieure au paramètre DUREE_AUTORISEE_ENTRE_2_PAGES
* 				les données de session sont détruites sinon le DERNIER_ACCES est renouvelé au temps actuel
* 
***********************************************************************************************************/
//durée de vie de cookies = fin navigateur
ini_set("session.use_cookies", "1");
ini_set("session.cookie_lifetime", "0");

//durée autorisée entre 2 pages
define("DUREE_AUTORISEE_ENTRE_2_PAGES", 1440); //secondes = 24 mn

//activer la session
session_start();

//vérifier la durée de vie de session autorisée (en secondes)
if (isset($_SESSION["DERNIER_ACCES"]) 
&& (time() - $_SESSION["DERNIER_ACCES"]) > DUREE_AUTORISEE_ENTRE_2_PAGES ) 
{
	//détruire la session si la durée autorisée est dépassée
	session_destroy();
	exit();
}
else 
{
	//réinitialiser le temps pour cette page = renouveler la durée de vie
	$_SESSION["DERNIER_ACCES"] = time();
}
/*********************************************************************************
* FIN DE TRAITEMENT DE LA DUREE DE VIE DE LA SESSION
* ********************************************************************************/
?>
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

__Damien__
Invité n'ayant pas de compte PHPfrance

11 juin 2008, 18:04

Je te remercie beaucoup sadeq, c'est vraiment très gentil de ta part, je pense que c'est exactement ce qu'il faut, je suis en train de tester tout ceci, je te tient au courant si tout fonctionne ;)

Merci à vous tous également

__Damien__
Invité n'ayant pas de compte PHPfrance

11 juin 2008, 18:40

Aie aie aie, le problème est toujours le même, après 24 minutes hop la session est flinguée meme si je navigue entre temps.

Comment faire pour résoudre ce problème s'il vous plait ? Est ce que le problème ne viendrait pas de cette variable ? session.gc_maxlifetime

Merci à tous !!!

ViPHP
ViPHP | 4674 Messages

11 juin 2008, 23:33

Hey :),

session.gc_maxlifetime n'est pas une variable, c'est une option de la configuration du php.ini.
gc signifie garbage collection que l'on peut traduire par … euh … routine de nettoyage. La valeur de l'option session.gc_maxlifetime est envoyée à la fonction du gestionnaire de stockage, le session save handler (par défaut, les fichiers pour PHP). La routine va supprimer les fichiers de session (sur le serveur donc) qui sont trop vieux de $maxlifetime.
Si tu veux le désactiver, utilise l'option session.gc_probability, et met la à 0 (la fréquence de passage de la routine est donnée par gc_probability/gc_divisor). Peut-être que ça réglerait ton problème.

Il y a une autre façon de désactiver la garbage collection, c'est en utilisant le paramètre n pour session.save_path. Je te laisse voir le manuel pour en savoir plus.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

11 juin 2008, 23:50

N'oublies pas de placer le bloc de code PHP que je t'ai donné au début de toutes les pages PHP de ton site. Car toutes les pages PHP doivent gérer la session comme le décrit le programme.

Le mieux est d'écrire ce bloc de codes dans un fichier PHP séparé et de s'y référer dans les autres pages par un include().


En plus, remets surtout les paramètres de PHP.ini suivants, à l'état par défaut.

Code : Tout sélectionner

; Utiliser les cookies (1 = Oui ou 0 = Non) session.use_cookies = 1 ; Nom par défaut de la session/cookie session.name = PHPSESSID ; intialiser la session quand la requête démarre (1 = Oui ou 0 = Non) session.auto_start = 0 ; Durée de vie du cookie en secondes, 0 = jusqu'à redémarrage du navigateur. session.cookie_lifetime = 0

Pour le garbage collector (processus de nettoyage des sessions) t'as qu'à le paramétrer pour qu'il n'agisse pas dans la même durée (24 mn) comme ça :

Code : Tout sélectionner

; Probabilité de suppression des données de session par le processus ramasse miettes ; par défaut : 1/1000 session.gc_probability = 1 session.gc_divisor = 1000 ; Tempo de suppression des sessions (86400 s = 24 h = 1 jour) session.gc_maxlifetime = 86400
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène