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 21/08/2007, 16h34   #1
Invité de passage
 
Étudiant
Inscription : août 2007
Messages : 7
Détails du profil
Informations personnelles :
Âge : 25

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2007
Messages : 7
Points : 0
Points : 0
Envoyer un message via MSN à SpintroniK
Par défaut [Sécurité] Sessions & POO?

Bonjour,

je suis face à un choix et je ne suis pas sûr de la meilleure solution.

J'utilise plusieurs classes pour mon script et je ne sauvegarde pas tout dans la base de données, j'utilise un fichier dans lequel j'ai "sérialisé" (linéarisé) une classe. Pour récupérer les données j'utilise la fonction unserialize.

Mon problème est que je me demande s'il vaut mieux relire le fichier à chaque fois qu'une page est chargée ou alors est-ce que cela serait plus judicieux de le mettre dans une variable de session ? Sachant que la classe comporte quand même pas mal variables et donc que ce qui doit être mémorisé prend au moins 4 à 5 Ko et peut aller jusqu'à 100-200 Ko voir plus dans le pire des cas.

Je me pose aussi une autre question quant à l'utilisation de la fonction session_register(), est-ce adapté à mon problème ?

Merci d'avance.

Cordialement,
Jérémy.
SpintroniK est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/08/2007, 16h49   #2
Membre du Club
 
Inscription : juillet 2006
Messages : 66
Détails du profil
Informations personnelles :
Âge : 25
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : juillet 2006
Messages : 66
Points : 50
Points : 50
Bonjour,

les sessions, nous sommes d'accord, ce sontd es fichiers stockés sur le serveur identifiés par un identifiant ( PHP_SESSID )

donc, il y a bien un acces fichiers entre chaque page

et a mon avis, même en fesant ton propre session_handler, tu ne fera pas mieux que le gestionnaire de session standard ( sinon ça serait fait )

Aprés un acces base de donnée, en plus de la taille de stockage je ne pense pas ( et peut-etre que je me trompe ) que ça améliorera tes performances.

Citation:
Je me pose aussi une autre question quant à l'utilisation de la fonction session_register(), est-ce adapté à mon problème ?
que veux tu dire ?

ps:

100-200 Ko tu te rend compte ?

EDIT :

il y a surement plein d'avis different dans ce post :
http://www.developpez.net/forums/d6088/php/php-sgbd/php-mysql/optimisation-scripts-php-mysql/
( histoire de te rendre plus indécis sur la solution )
Finidrigoler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/08/2007, 17h32   #3
Invité de passage
 
Étudiant
Inscription : août 2007
Messages : 7
Détails du profil
Informations personnelles :
Âge : 25

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2007
Messages : 7
Points : 0
Points : 0
Envoyer un message via MSN à SpintroniK
Citation:
Envoyé par _cqu_ Voir le message
Bonjour,

Aprés un acces base de donnée, en plus de la taille de stockage je ne pense pas ( et peut-etre que je me trompe ) que ça améliorera tes performances.
Est-ce que tu parle de la lecture d'un fichier stocké sur le serveur avec fopen ?
Citation:
Envoyé par _cqu_ Voir le message
que veux tu dire ?
J'ai vu qu'on pouvait utiliser cette fonction comme ceci : sessio_register("Nom_de_la_Classe"); (je pense).
Citation:
Envoyé par _cqu_ Voir le message
ps:

100-200 Ko tu te rend compte ?
Qu'est-ce qui est étonnant ? (ça peut aller jusqu'à plusieurs (10 maxi) Mo dans le cas le plus exagéré).
Citation:
Envoyé par _cqu_ Voir le message
EDIT :

il y a surement plein d'avis different dans ce post :
http://www.developpez.net/forums/showthread.php?t=6088
( histoire de te rendre plus indécis sur la solution )
[/QUOTE]

J'ai parcouru ce topic, il est assez étonnant (du début à la fin), mais la plus grande optimisation reste au niveau des requêtes ce que j'essaye justement d'éviter avec ce système.
D'ailleurs, est-ce une bonne idée ?
SpintroniK est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/08/2007, 18h02   #4
Membre du Club
 
Inscription : juillet 2006
Messages : 66
Détails du profil
Informations personnelles :
Âge : 25
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : juillet 2006
Messages : 66
Points : 50
Points : 50
Citation:
J'ai vu qu'on pouvait utiliser cette fonction comme ceci : session_register("Nom_de_la_Classe"); (je pense).
session_register est déprécié et servait seulement a stocker une variable en session.

donc $_SESSION['unevariable'] ou session_register('unevariable') revient au même.

Citation:
Est-ce que tu parle de la lecture d'un fichier stocké sur le serveur avec fopen ?
La plus part du temps ( le gestionnaire de session par defaut ), si tu regarde le contenu d'un cookie de session, il n'y a rien hormis la valeur de PHP_SESSID,
( d'ailleur parfois il n'y a pas de cookie et l'identifiant de session est passé par l'url session.use_cookies = 0 )
ou crois tu que les informations sont stockés... ?



( dans un fichier, dont tu peux voir la localisation via http://fr.php.net/manual/fr/ref.sess...sion.save-path )
Finidrigoler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/08/2007, 18h45   #5
Invité de passage
 
Étudiant
Inscription : août 2007
Messages : 7
Détails du profil
Informations personnelles :
Âge : 25

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2007
Messages : 7
Points : 0
Points : 0
Envoyer un message via MSN à SpintroniK
Si j'ai bien compris tu me dit qu'il vaut mieux que j'utilise une session que mon système avec un fichier que j'ouvre via fopen... ?
Mais j'ai quand même besoin du fichier pour charger les données lors du premier chargement de la page... donc cela revient à prendre 2 fois plus de place sur le serveur.

Sinon, je ne suis pas sûr de tout avoir compris, est-ce que c'est plus lent de faire :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
<?php
 
// Lecture des données
$contenu = implode(chr(13), file('fichier')); 
$class = unserialize($contenu);
 
// ... SCRIPT
 
//Ecriture des données
$contenu = serialize($class);
$fp = fopen('fichier', 'wb');
fwrite($fp, $contenu, strlen($contenu));
fclose($fp);
?>
que ça :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
<?php
 
// Lecture des données
session_start();
$contenu = $_SESSION['fichier'];
$class = unserialize($contenu)
 
//... SCRIPT
 
// Ecriture des données
$_SESSION['fichier'] = serialize($class);
session_destroy();
?>
Sachant que pour cette dernière méthode un fichier devra être lu lors du login pour charger les données et il devra être écrit à la fin de la session (ce qui ne me pose pas de problème au niveau du code, c'est tout à fait réalisable), il faut donc quand même utiliser la première méthode.

Qu'est-ce qui est vraiment mieux ?
SpintroniK est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/08/2007, 11h36   #6
Membre du Club
 
Inscription : juillet 2006
Messages : 66
Détails du profil
Informations personnelles :
Âge : 25
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : juillet 2006
Messages : 66
Points : 50
Points : 50
Tout d'abord,

Code :
1
2
3
// Lecture des données
$contenu = implode(chr(13), file('fichier')); 
$class = unserialize($contenu);
dans la premiére ligne, tu obtiens un fichier sous forme de tableau ( une ligne du tableau = une ligne du fichier )
puis tu implode ce tableau en le séparant par un retour chariot.

le plus rapide ne serait il pas de seulement récupéré le contenu qui apparement ( selon ton code ) est déja séparé sous forme de ligne.

je te conseille donc file_get_contents() ( plutot que "file" suivi de implode )

Sinon, je pense que ton deuxiéme bout de code est plus rapide, mais puisque tu dis ne pas avoir le choix, utilise la premiére solution

Aprés pour ce qui est de savoir s'il est plus rapide d'avoir une session qui contient beaucoup de donnée ou un acces base de donnée, je ne sais pas.
Finidrigoler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/08/2007, 13h49   #7
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
Pour revenir sur les sessions :

Un argument en faveur des sessions : elles sont, disons, déjà prévues pour. Vous n'avez aucun besoin de sérialiser ou désérialiser vous-mêmes vos données ce mécanisme est transparent car effectué par PHP en interne (bien qu'il y est quelques particularités pour des objets).

Arguments en sa défaveur :
  • les sessions ne sont pas, par définition, un moyen d'offrir une persistance à vos données. Elles ne durent qu'un certain temps (expiration), plus ou moins le temps de la navigation de l'utilisateur. Bien sûr on peut aller contre mais vous ne pourrez plus profiter de leur fonctionnement original et la sécurité s'en retrouve terriblement affaiblie
  • vous ne trouverez aucun moyen exact de savoir quand la session est terminée si l'utilisateur ne le fait pas lui-même via un lien de type Déconnexion. On peut penser à Javascript mais celui-ci peut être désactivé. La méthode la plus efficace consiste à se baser sur une base de données et de faire régulièrement un nettoyage des sessions inactives passées un certain délai
    ( voir Utiliser une base de données pour sécuriser vos sessions).

Par contre, des objets placés en session ne seront pas forcément lus moins souvent que votre autre méthode (les fichiers). Dès lors qu'il y aura l'appel à session_start vos objets seront désérialisés par PHP pour vous les mettre à votre disposition via le tableau $_SESSION (c'est du tout ou rien : vous ne pouvez pas demander qu'un seul objet par exemple).
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/08/2007, 18h44   #8
Invité de passage
 
Étudiant
Inscription : août 2007
Messages : 7
Détails du profil
Informations personnelles :
Âge : 25

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2007
Messages : 7
Points : 0
Points : 0
Envoyer un message via MSN à SpintroniK
J'utilise la fonction __sleep() pour la sérialisation de mes données et comme je n'ai besoin que de 3 variables, elles sont les seules à être sérialisées (ce sont 3 tableaux).

Je ne comprend pas bien comment on utilise les sessions dans ce cas de figure, dites moi si je me trompe mais je vois ça comme suit (d'après ce que j'ai compris de vos dires):
Code :
1
2
3
4
5
6
7
8
9
10
11
<?php
\\ Début...
$classe = new classe();
 
session_strat();
 
$_SESSION['classe'] = $classe; // Et la "sérialisation" est automatique ?
 
//... Suite et fin du script.
 
?>
Mais dans ce cas je doit sérialiser toutes les variables de la classe.

D'ailleurs, est-ce que si j'utilise la fonction __wakeup() de la manière suivante cela peut être utilie ? :
Code :
1
2
3
4
5
6
7
8
9
 
 
function __wakeup()
{
     $this->var1['index'] = '';
     $this->var2['index'] = '';
     $this->var3['index'] = '';
// Pour vider des variables inutiles de certains tableaux (mais qui doivent quand même être sauvegardées)
}
Merci.
SpintroniK est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/08/2007, 18h55   #9
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
Citation:
Envoyé par SpintroniK
J'utilise la fonction __sleep() pour la sérialisation de mes données et comme je n'ai besoin que de 3 variables, elles sont les seules à être sérialisées (ce sont 3 tableaux).
Oui c'est une solution pour ne sérialiser que le nécessaire.

Citation:
Envoyé par SpintroniK
Je ne comprend pas bien comment on utilise les sessions dans ce cas de figure, dites moi si je me trompe mais je vois ça comme suit (d'après ce que j'ai compris de vos dires):
Code :
1
2
3
4
5
6
7
8
9
10
11
<?php
\\ Début...
$classe = new classe();
 
session_strat();
 
$_SESSION['classe'] = $classe; // Et la "sérialisation" est automatique ?
 
//... Suite et fin du script.
 
?>
Mais dans ce cas je doit sérialiser toutes les variables de la classe.
Oui c'est ainsi. Si vous ne voulez pas tout (attributs) sérialiser utilisez la méthode magique __sleep.

Citation:
Envoyé par SpintroniK
D'ailleurs, est-ce que si j'utilise la fonction __wakeup() de la manière suivante cela peut être utilie ? :
Code :
1
2
3
4
5
6
7
8
9
 
 
function __wakeup()
{
     $this->var1['index'] = '';
     $this->var2['index'] = '';
     $this->var3['index'] = '';
// Pour vider des variables inutiles de certains tableaux (mais qui doivent quand même être sauvegardées)
}
Elle peut être utilisée elle aussi mais je pense que vous n'avez pas saisi son but : elle est appelée à la désérialisation et non à la sérialisation. Elle permettrait par exemple de reconstituer une variable de classe de type ressource comme une connexion à une base de données à partir de ses différents paramètres (hôte, login, mot de passe, ...) - c'est juste un exemple.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2007, 14h14   #10
Invité de passage
 
Étudiant
Inscription : août 2007
Messages : 7
Détails du profil
Informations personnelles :
Âge : 25

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2007
Messages : 7
Points : 0
Points : 0
Envoyer un message via MSN à SpintroniK
Je pense avoir trouvé une solution mais pour cela il faudrait que je procéde de la manière suivante :

- Un fichier contient certaines variables sérialisées
- Et un autre fichier en contient d'autre

Comme ça, sur certaines pages je ne doit lire un seul qui fichier qui est de taille relativement petite (au maximum quelques Ko).
Mais pour d'autre pages je n'ai pas le choix, il faut tout de même lire le second fichier.
Cela pose quand même un autre problème puisque qu'il faudrait utiliser deux fois d'affilé la désérialisation. Comment faire alors ?
J'ai pensé à ceci : je lis un des deux fichiers et on est sur une page qui nécessite de lire le second j'utilise ceci :
Code :
<?php $classe = unserialize($contenu_fichier1.$contenu_fichier2); ?>
Une meilleure idée ?

Mais au fait, est-ce que la fonction __wakeup est exécutée avant ou après la désérialisation ?
SpintroniK est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2007, 20h24   #11
Invité de passage
 
Inscription : février 2007
Messages : 3
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 3
Points : 1
Points : 1
__wakeup est appelé pour désérialisé une classe. donc il n'y a pas d'appel avant ou après. ce que je te propose si j'ai bien compris ton pb:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
class class1 {
 
$contenu1
 
   __sleep(){
       $c1 = serialize($this->contenu1);
       file_put_contents(ton_premier_fichier, $c1)
   }
   __wakeup(){
      $c1 = file_get_contents (ton_premier_fichier)
      $this->contenu1 = unserialize($c1)
    }
}
et après pareil pour ta deuxième classe:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class class2 extends class1{
 
$contenu2
 
   __sleep(){
       parent::__sleep()
       $c2 = serialize($this->contenu2);
       file_put_contents(ton_deuxieme_fichier, $c2)
return array('contenu1', 'contenu2')
   }
   __wakeup(){
      parent::__wakeup()
      $c2 = file_get_contents (ton_deuxieme_fichier)
      $this->contenu2 = unserialize($c2)
    }
}
kowal_2205 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 14h13.


 
 
 
 
Partenaires

Hébergement Web