Page 1 sur 1

[SESSIONS] Gestion des sessions avec MySQL

Posté : 28 févr. 2006, 11:56
par Baal
Bonjour,

La gestion des sessions dans une base de données (MySQL) m'intéresse. J'y vois deux avantages : statistiques sur le comportement des utilisateurs, sécurité accrue.

J'ai lu le très intéressant 'PHP 5 avancé' mais à part une vague référence à la fonction 'set_save_handler', pas de méthode ou d'analyse de ce type de gestion. :? J'ai aussi lu le 'Pratique de MySQL et PHP' qui m'a beaucoup déçu et m'a même refroidi quand à l'achat d'un livre : on y trouve bien peu de technique 'avancée' et beaucoup d'informations de base déjà glanées ici et là sur le net. Là encore, malgré le titre alléchant, aucune informations. :( J'ai bien trouvé sur internet quelques sources pour m'expliquer le 'comment ?' mais pas le 'pourquoi ?'. Et encore, ces méthodes étaient réduites à la plus simple mise en oeuvre. Bref :

1/ Quels sont les avantages/désavantages à gérer les sessions de mon site web dans une base de données (MySQL) ?

2/ Quelqu'un serait-il disposé à m'expliquer comment mettre en place une gestion efficace des sessions à travers une base de données (MySQL) ?

D'avance merci pour vos réponses, :)
Baal.

Posté : 28 févr. 2006, 12:21
par Ripat
Bonjour Baal,

Une première piste ici:
http://php.belnet.be/manual/fr/function ... .php#60316

Je n'ai jamais testé au niveau rapidité. Je ferai un petit pseudo-bench à l'occasion car la question que tu soulèves est intéressante.

Apparemment les données de sessions sont stockées sous une forme sérialisée. Elle doivent donc, tout comme pour les sessions classiques, être dé-sérialisées. Je ne vois pas trop l'avantage en rapidité. A voir.

Posté : 28 févr. 2006, 13:15
par Ripat
Voilà le résultat de mon petit pseudo-bench:
  • Méthodologie
    Dans une page, affecter 25 fois le contenu de la super globale $_SERVER (pourquoi pas ?) à 25 variables de session. Dans le genre:
    for ($i = 0; $i <= 25; $i++){
      $_SESSION['server'][$i] = $_SERVER;
    }
    Dans la page B, afficher le contenu de la variable $_SESSION.
  • Résultats:

    Code : Tout sélectionner

    Fichier de session MySQL Save 0.00347 Read 0.00311 Fichier de session plat Save 0.00171 Read 0.00145
Peut-être pourrait-il y avoir un avantage s'il y a un très grand nombre de sessions actives ?

A condition que l'accès à la ligne d'une session dans un fichier MySQL soit plus rapide que le système de fichier de l'OS du serveur (une session = un fichier).

Des amateurs pour tester ?

Posté : 28 févr. 2006, 13:16
par Baal
Merci Ripat, je suis passé à côté de ces informations ! :oops: Il y a même un lien vers un article assez complet de Zend ! :D

Effectivement, il faut sérialiser l'objet qui contient les données de la session. Il faut le faire soi-même comme l'indique un des derniers commentaires pour éviter les problèmes qui apparaissent quand on laisse à PHP le soin de s'en occuper à la fermeture de la session.

Le côté performance est certes important mais pas critique pour moi. Je pense que cela ne peut pas être aussi rapide qu'une gestion des sessions par défaut, de toute manière. Je suis quand même intéressé par tes mesures ! ;)

Je n'ai pas bien compris par contre le côté 'sécurité' de la transaction avec MySQL. On peut intercepter les données de la transaction lors de la sauvegarde de la session ?! :shock:

Posté : 28 févr. 2006, 13:19
par Baal
Peut-être pourrait-il y avoir un avantage s'il y a un très grand nombre de sessions actives ?
C'est effectivement un des avantages cité dans l'article de Zend (http://www.zend.com/zend/spotlight/code ... -wade8.php).

Y a-t-il des personnes sur ce forum qui utilise ce type de gestion de sessions ? Si oui, comment ? Pour quel usage ?

Posté : 28 févr. 2006, 13:36
par Ripat
Je n'ai pas bien compris par contre le côté 'sécurité' de la transaction avec MySQL. On peut intercepter les données de la transaction lors de la sauvegarde de la session ?! :shock:
Non. Je ne pense pas que stocker ses sessions dans une table MySQL soit plus sécuritaire que dans un répertoire protégé (droits restreints) de l'OS du serveur. Bon, c'est vrai, il y a le mot de passe MySQL mais bon...

Par contre, les avantages cités par l'article que tu as indiqué me semblent valables, surtout celui de pouvoir facilement rajouter des infos supplémentaires sans trop d'effort dans les données de session. En ce qui concerne le load balancing, le jour où ton site en sera arrivé là, tu pourras prendre une retraite dorée au soleil et ne plus te soucier des sessions, si ce n'est des longues sessions apéro. :wink:

Posté : 28 févr. 2006, 14:14
par Baal
Non. Je ne pense pas que stocker ses sessions dans une table MySQL soit plus sécuritaire que dans un répertoire protégé (droits restreints) de l'OS du serveur. Bon, c'est vrai, il y a le mot de passe MySQL mais bon...
Dans une base de données MySQL, on peut crypter les données. Les données de la session sont-elles en clair dans un fichier de session ?
En ce qui concerne le load balancing, le jour où ton site en sera arrivé là, tu pourras prendre une retraite dorée au soleil et ne plus te soucier des sessions, si ce n'est des longues sessions apéro. :wink:
C'est ce que je me suis dit aussi ! :D

Posté : 28 févr. 2006, 14:25
par Ripat
Les données de la session sont-elles en clair dans un fichier de session ?
Oui. Mais rien ne t'empêche de crypter les données sensibles avant de les mettre en session.

Posté : 28 févr. 2006, 14:31
par Baal
Merci Ripat, j'en sais maintenant assez pour m'y mettre vraiment.

Si d'autres utilisateurs utilisent ce type de gestion des sessions, j'aimerais avoir leur avis.

A bon entendeur, salut ! :D
Baal.

PS : Je posterais mon code ici quand le module sera fait.

Posté : 28 févr. 2006, 15:25
par Baal
Il y a une discussion au sujet des accès concurrent aux données de la session dans les commentaires de l'article de Zend. Je crois savoir que chaque script à son propre contexte (copie en mémoire des données de la session à l'ouverture de la session).

Il n'y a pas de problème quand on utilise la gestion de session par défaut (fichier déposé sur le serveur). Le fichier de la session est verrouillé à l'ouverture et n'est "relaché" que quand la session est fermé.

Un des "commentateurs" suggère une solution fortement dépendante du moteur de la base de données (MyISAM/InnoDB). Quelqu'un a-t-il géré les accès concurrents sur une base de données ? Si oui, comment ?

Posté : 28 févr. 2006, 15:30
par Baal
Je me réponds à moi-même :D : http://bob.developpez.com/phpsync/

Posté : 28 févr. 2006, 17:15
par Ripat
Je me réponds à moi-même :D : http://bob.developpez.com/phpsync/
Oui mais il ne s'agit pas du même problème. Ce lien parle d'un verrouillage d'une donnée d'application, pas des variables de session.

Si tu veux implémenter un verrouillage semblable au système de session standard (par fichier) je ne vois pas trop quelle méthode du handler de session (open, close, read, write, destroy ou gc) devrait prendre en charge le verrouillage et laquelle le déverrouillage.

Le sujet est intéressant. Poste-nous ta solution!