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 :

Comprendre les sessions en profondeur


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 13
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    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...

  3. #3
    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
    Par défaut
    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.

  4. #4
    Membre Expert
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 149
    Par défaut
    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.

  5. #5
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Ça figure dans la doc :
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    (now - sbuf.st_mtime) > maxlifetime) {
    st_mtime étant (man (2) stat) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    time_t        st_mtime;    /* Heure dernière modification */
    PS : c'est PHP qui gère les sessions, pas Apache.

Discussions similaires

  1. Problème avec les sessions
    Par philippef dans le forum Langage
    Réponses: 2
    Dernier message: 27/10/2005, 15h19
  2. [Sessions] Les sessions multi-applications
    Par brazza dans le forum Langage
    Réponses: 4
    Dernier message: 13/10/2005, 17h53
  3. Comprendre les matrices 3D
    Par tavman dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 11/09/2005, 13h18
  4. les sessions PHP
    Par smh_master dans le forum Langage
    Réponses: 4
    Dernier message: 31/08/2005, 14h13
  5. PB Réseau sur les sessions ouvertes ?
    Par nico___23 dans le forum Développement
    Réponses: 1
    Dernier message: 07/01/2005, 09h50

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