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 08/12/2011, 11h45   #1
Invité de passage
 
Inscription : novembre 2006
Messages : 13
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 13
Points : 1
Points : 1
Par défaut Comprendre les sessions en profondeur

Bonjour à vous,

Ma question peut paraître étrange pour certains, mais je tente de comprendre un peu mieux le fonctionnement des sessions au niveau du stockage des données sur le serveur.

Bien que j'ai toujours utilisé les sessions sans vraiment savoir comment elles fonctionnaient (en dehors du principe), aujourd'hui je comprends comment et où les données sont stockées, et donc comment elles peuvent véhiculer à travers les différentes pages.

Ce que je comprends beaucoup moins, c'est pourquoi le fichier de session est ré-écrit à chaque actualisation de la page, et ce même si les variables de session n'ont pas été modifiées.

Je donne un exemple:

Code :
1
2
3
4
5
6
7
8
9
<?php
session_start();
if(isset($_SESSION["id"])){
	// si la variable session id existe
}
else{
	$_SESSION["id"]=true;
}
?>
Imaginons que ma session a comme SESSID 69h9rfsaqks9tgsf3tc10vrm53, le fichier qui contient les variables est stocké dans /var/lib/php5/sess_69h9rfsaqks9tgsd3tc10vrm53 (sous GNU/Linux). Lorsque j'affiche la page pour la première fois, la variable session id, qui n'existe pas, est stocké dans le fichier. Si j'actualise ma page, le fichier est ré-écrit avec les même valeur. Pourquoi, si aucune modification n'a été faite.

Une petite explication est la bienvenue.
Merci d'avance.
D_ident_1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2011, 13h26   #2
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 991
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 991
Points : 5 031
Points : 5 031
J'imagine qu'il est plus coûteux en terme de cycles de vérifier que les données de session n'ont pas changés que d'écrire directement dans le fichier tout simplement.

Sinon, une explication possible pourrait être qu'apache se sert de la date de dernière modification du fichier de session pour déterminer une expiration mais je ne saurais l'affirmer.

Peut être qu'un expert PHP comme Julien Pauli pourrait répondre...
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2011, 19h51   #3
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:
Envoyé par D_ident_1
Si j'actualise ma page, le fichier est ré-écrit avec les même valeur. Pourquoi, si aucune modification n'a été faite.
Très bonne question.
Je n'ai aucune idée, et en savoir plus m'intéresse aussi.


Citation:
Envoyé par Benjamin Delespierre
J'imagine qu'il est plus coûteux en terme de cycles de vérifier que les données de session n'ont pas changés que d'écrire directement dans le fichier tout simplement.
On pourrait peut être supposer que Php serait optimisé, et par exemple se contenter de modifier la date de création (ou de dernière modification) du fichier sans plus, ensuite récupérer son contenu et le rendre dispo dans $_SESSION.
Ici il n'y aurait donc aucune réécriture du contenu.
Une réécriture des données aurait alors lieu que s'il y a modification d'au moins une variable de session.
Pure hypothèse bien sûr.


Je remarque cependant que si on opte (pour exemple) de gérer les sessions dans sa Bdd grâce à la fonction session_set_save_handler(), il me semble qu'on a pas trop le choix de réinsérer les données.

Ceci dit, il me semble qu'une Bdd comme MySQL serait capable de détecter si les données sont très exactement les mêmes, et dans telle cas l'UPDATE ne se ferait pas (la valeur de retour serait FALSE).
Ceci finalement aurait le même comportement de l'hypothèse précédente.

Ceci dit, normalement il doit quand même avoir la date de dernière mise à jour qui doit changer, donc les données ne devraient pas être les mêmes.
Mais on peu toujours procéder en 2 requêtes SQL :
- La 1ère pour modifier la date
- La 2ème pour la valeur (les données de session, sérialisées entre autres). Et là, si les données sont les mêmes, le UPDATE n'aurait pas lieu.
(je ne sais si j'ai été clair).


Mise à part ça, j'ai jamais lu nulle part une technique (en Php) permettant de savoir si une partie du contenu d'un fichier à été modifié (mise à part une sauvegarde et faire une comparaison).
Il y a bien la date de dernière modification, mais ça ne dit pas s'il y a eu réellement modification.


Intéressant en tout cas.
__________________
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 09/12/2011, 22h28   #4
Membre Expert
 
Avatar de transgohan
 
Homme Baptiste ROUSSEL
Étudiant
Inscription : janvier 2011
Messages : 812
Détails du profil
Informations personnelles :
Nom : Homme Baptiste ROUSSEL
Localisation : France, Territoire de Belfort (Franche Comté)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 812
Points : 1 533
Points : 1 533
Citation:
Sinon, une explication possible pourrait être qu'apache se sert de la date de dernière modification du fichier de session pour déterminer une expiration mais je ne saurais l'affirmer.
C'est ce que j'ai lu sur un autre forum sur le sujet, il n'y avait par contre pas de lien vers une quelconque DOC ou autre pour le confirmer.
__________________
Toujours se souvenir que la majorité des ennuis viennent de l'espace occupé entre la chaise et l'écran de l'ordinateur.
transgohan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2011, 23h01   #5
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Ça figure dans la doc :
Citation:
Note: Si vous utilisez le gestionnaire de sessions par fichier, qui est fourni par défaut, votre système doit garder la trace des dates de dernier accès aux fichiers (atime). La FAT de Windows ne le fait pas, il vous faudra donc trouver un autre système pour gérer les sessions qui ont expiré. Depuis PHP 4.2.3, on utilise mtime (date de modification) au lieu de atime. Ainsi, vous n'aurez plus de souci avec les systèmes de fichiers qui ne gèrent pas atime.
(source)

Sinon il suffit de lire les sources (ext/session/mod_files.c, fonction ps_files_cleanup_dir) :
Code C :
(now - sbuf.st_mtime) > maxlifetime) {
st_mtime étant (man (2) stat) :
Code :
time_t        st_mtime;    /* Heure dernière modification */
PS : c'est PHP qui gère les sessions, pas Apache.
julp est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h54.


 
 
 
 
Partenaires

Hébergement Web