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 :

Désérialisation d'une session à partir de son fichier


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut Désérialisation d'une session à partir de son fichier
    Bonjour,

    Voila, je cherche à recuperer une session PHP en lisant le fichier associé.

    J'ai donc fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    if (isset($PHPSESSID))
    {
       $sessionFile = "/tmp/sessions/sess_".$PHPSESSID;
     
       if (file_exists($sessionFile)) 
       {
          $fp = fopen($sessionFile, "r");
          flock($fp, LOCK_SH);
          rewind($fp);
          $sessionData = fread($fp, 1500000);
          fclose($fp);
          $testSession = unserialize("'".$sessionData."'");
       }
    }
    Mais voila, $testSession reste deseperement vide (alors que le fichier est bien lu) et j'obtiens l'erreur suivante :

    Warning: unserialize() failed at offset 0 of 470 bytes

    Comment proceder ?

    (la conf de mon serveur est celle par defaut, ou presque)

  2. #2
    Membre éprouvé
    Inscrit en
    Juin 2007
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Juin 2007
    Messages : 89
    Par défaut
    Bonjour,

    il ne me semble pas que ce soit possible ce que tu essaye de faire. les fonctions serialize/unserialize n'agissent que sur une variable à la fois, alors qu'un fichier de session comporte plusieurs variables. Donc incompatibilité.

    Si tu as besoin de personnaliser la gestion des sessions il faut que tu gère toi même les sessions en créant les fonctions adéquat: http://fr3.php.net/manual/fr/functio...ve-handler.php

  3. #3
    Membre éclairé Avatar de The Nux
    Profil pro
    Inscrit en
    Février 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 79
    Par défaut
    Tu peux toujours coder le déserialiseur toi même, ça doit pas être bien sorcier, par ce que la syntaxe des fichiers de session ressemble à celle des serializes normaux à quelques détails près.
    Mais pourquoi as-tu besoin de faire ça ?

  4. #4
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut
    il ne me semble pas que ce soit possible ce que tu essaye de faire. les fonctions serialize/unserialize n'agissent que sur une variable à la fois, alors qu'un fichier de session comporte plusieurs variables. Donc incompatibilité.
    Ah ah ! Ceci explique cela...

    Je vais donc de ce pas coder un deserialiseur....


    Mais pourquoi as-tu besoin de faire ça ?
    Les interfaces sur lesquelles je bosse font parfois des traitements tres longs, et si plusieurs traitements sont lancés à la fois, seul le premier peut faire un session_start (à cause du lock du fichier de session)

    Vu que la plusplart du temps on n'a juste besoin des données de session en lecture, je cherche à lire directement le fichier pour ne pas bloquer les acces

  5. #5
    Membre éclairé Avatar de The Nux
    Profil pro
    Inscrit en
    Février 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 79
    Par défaut
    okidoki
    Si tu veux mon avis, tu dois pouvoir trouver un moyen de passer le fichier dans un preg_replace qui rend le fichier déserializable par unserialize()

  6. #6
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut
    Oui, c'est ce que je viens de faire et ça marche plutot pas mal...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    if (isset($PHPSESSID))
    {
        $sessionFile = "/sess_".$PHPSESSID;
     
        if (file_exists($sessionFile)) 
        {
            $fp = @fopen($sessionFile, "r");
            flock($fp, LOCK_SH);
            rewind($fp);
            $sessionData = fread($fp, 1500000);
            fclose($fp);
     
            while (strlen($sessionData)>0)
            {
                // Les données de la variable
                $position           = strrpos($sessionData,'|');
                $donneesVariable    = substr($sessionData,$position+1);
                $sessionData        = substr($sessionData,0,$position);
     
                // Le nom de la variable
                if ( (strrpos($sessionData,';') === FALSE) && (strrpos($sessionData,'}') === FALSE)) $position = -1;
                    else $position = max(strrpos($sessionData,';'),strrpos($sessionData,'}'));
                $nomVariable = substr($sessionData,$position+1);
     
                if (strpos($nomVariable,"!") === FALSE)
                    $sessionArray[$nomVariable] = $donneesVariable;
     
                if ($position < 0) break;
     
                $sessionData = substr($sessionData,0,$position+1);
            }
     
            foreach($sessionArray as $key => $value)
            {
                $chaine = '$'.$key.' = unserialize(\''.str_replace("'","\'",$value).'\');';
                eval($chaine);
            }
        }
    }
    else
    {
        session_start();
    }
    Bon, j'ai pas utilisé les expression regulieres, et j'ai remarqué 2-3 trucs :

    1/ les definitions de variables sont separées par "|"
    2/ les variables serialisées se terminent par ";", les objets par "}"
    3/ j'ai ça dans mon fichier : g_Logged|b:1;!g_SupportLock|g_DebugLevel|i:1536;

    ça correspond à :
    - bool g_Logged = true;
    - int g_DebugLevel = 1536;
    - ???? pour g_SupportLock ????

    Donc que faire pour la variable g_SupportLock ?

Discussions similaires

  1. Réponses: 1
    Dernier message: 15/10/2014, 18h00
  2. Tester l'existence d'une session à partir de son ID
    Par Jilimay dans le forum Langage
    Réponses: 5
    Dernier message: 16/06/2011, 15h17
  3. Récupérer une variable à partir de son nom ...
    Par CynO dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 13/10/2005, 17h59
  4. "Mettre le focus" à une application à partir de son Handle
    Par Tardiff Jean-François dans le forum Composants VCL
    Réponses: 2
    Dernier message: 04/07/2005, 09h54
  5. [CR] Inserer une image à partir d'un fichier
    Par Gandalf24 dans le forum SAP Crystal Reports
    Réponses: 7
    Dernier message: 23/07/2003, 11h55

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