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 04/07/2007, 13h55   #1
Membre chevronné
 
Avatar de buzzkaido
 
Homme
Ingénieur développement logiciels
Inscription : juillet 2004
Messages : 817
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 31
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 : 817
Points : 636
Points : 636
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 :
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)
buzzkaido est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2007, 17h54   #2
Membre régulier
 
Inscription : juin 2007
Messages : 89
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : juin 2007
Messages : 89
Points : 95
Points : 95
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
dewsz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2007, 00h54   #3
Membre régulier
 
Avatar de The Nux
 
Inscription : février 2006
Messages : 79
Détails du profil
Informations personnelles :
Âge : 22

Informations forums :
Inscription : février 2006
Messages : 79
Points : 84
Points : 84
Envoyer un message via MSN à The Nux
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 ?
The Nux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2007, 09h39   #4
Membre chevronné
 
Avatar de buzzkaido
 
Homme
Ingénieur développement logiciels
Inscription : juillet 2004
Messages : 817
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 31
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 : 817
Points : 636
Points : 636
Citation:
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....


Citation:
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
buzzkaido est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2007, 13h51   #5
Membre régulier
 
Avatar de The Nux
 
Inscription : février 2006
Messages : 79
Détails du profil
Informations personnelles :
Âge : 22

Informations forums :
Inscription : février 2006
Messages : 79
Points : 84
Points : 84
Envoyer un message via MSN à The Nux
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()
The Nux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2007, 14h36   #6
Membre chevronné
 
Avatar de buzzkaido
 
Homme
Ingénieur développement logiciels
Inscription : juillet 2004
Messages : 817
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 31
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 : 817
Points : 636
Points : 636
Oui, c'est ce que je viens de faire et ça marche plutot pas mal...

Code :
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 ?
buzzkaido est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2007, 10h16   #7
Membre régulier
 
Inscription : juin 2007
Messages : 89
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : juin 2007
Messages : 89
Points : 95
Points : 95
Sinon pourquoi ne pas fermer la session le plutôt possible avec session_write_close() ?

Tu ouvre ta session, tu récupères les variables dont tu as besoin, tu ferme ta session, puis tu peux lancer tes traitements sans bloquer le reste.
dewsz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2007, 10h17   #8
Membre chevronné
 
Avatar de buzzkaido
 
Homme
Ingénieur développement logiciels
Inscription : juillet 2004
Messages : 817
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 31
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 : 817
Points : 636
Points : 636
Oui, c'est la solution la plus simple, mais on a remarqué certains bugs avec session_write_close sur nos serveurs en PHP 4.1
buzzkaido est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h01.


 
 
 
 
Partenaires

Hébergement Web