PHP5 - CLASSE DE GESTION DE SESSION

malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 - 29 mai 2006 à 15:28
jadu Messages postés 217 Date d'inscription mercredi 26 juillet 2006 Statut Membre Dernière intervention 16 août 2018 - 29 août 2012 à 11:44
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/37830-php5-classe-de-gestion-de-session

jadu Messages postés 217 Date d'inscription mercredi 26 juillet 2006 Statut Membre Dernière intervention 16 août 2018
29 août 2012 à 11:44
Oui SMAHANEAAI (tu parles d'un pseudo !!! )
pour moi aussi un petit exemple de "mise enpratique" aurait été utile pour ce tuto !
Car c'est bel et bien un tuto, vu tous les trucs à apprendre dedans !!!
smahaneAAI Messages postés 68 Date d'inscription jeudi 27 janvier 2011 Statut Membre Dernière intervention 7 février 2014 10
9 mars 2012 à 12:33
merci bcp pr le code qui est sans aucun doute très utile, mais bon je suis débutante avec php5 et c'est la premiere fois que je désir l'utiliser dans la création des Sessions et je n'ai pas tout à fait compris comment faire appelle à ces méthodes de cette class!! par exemple je n'ai pas compris c'est quoi le paramètre "savePath" ? et puis pour "$session_name" faut il par exemple au début du code de la page dont on utilise la session faire son initiation (le fait de la nommé) ??

un petit exemple peut être utile pour moi :D
et merci d'avance!
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
30 mai 2006 à 13:51
"en gros tu veux limiter le nombre de visiteurs à ton site... et il fait quoi le 11 eme internaute qui veut se connecter à ton site. " > 10 sessions / IP simultané (ip+hots), pour eviter que la db ne souffre par flood (ex: je m'identifit, je me reidentifit, 1000 fois de suite etc...), donc generer autemps de sessions inutiles.
IP+Host, pour la simple et bonne raison: une ip peut etre reatribuer, mais l'host lui theoriquement ne sera pas le meme, exemple: une IP Wanadoo, l'ip je la rajoute pour avoir quelque chose en cas où l'host n'est plus valide: une IP Wanadoo.
10 sessions/Ip : Imagine un sous reseau avec 3 pc une meme IP publique connecté à ton site, si ils perdent leurs id de session, ils vont devoir la reecrer, mais il leurs restera encore quelques essaies. Tout cela pour eviter de mettre en danger MySQL.


Oui parce que toi tu te base sur l'ip... mais dans le cas d'une session classique comme c'est le cas ici l'ip on s'en fout... .. .

Et si tu ne comprend pas pourqoui il faut effacer toutes les sessions expirer (je parle des sessions coté db), c'est tout simple: tout le monde ne clique pas sur "Deconnexion".


C'est toi qui ne doit pas avoir compris ce que je voulais dire... tu crois qu'entre le moment ou je tape ce message et le moment ou je vais le soumettre il y en aura beaucoups des sessions expirées... alors imagine sur un site à petit traffic... faire un gc à chaque instanciation de la class ça veut dire une requete de plus à chaque chargement de page (voir plus si tu fais pas de l'instanciation unique) c'est totalement inutile... si tu regarde le systeme de session par défaut le garbage collection se déclenche en moyenne toute les 100 éxécutions (1% de probabilité de déclenchement)... c'est quoi le mieux... déclencher le gc à chaque instanciation pour virer 3 pauvres sessions expirées ou le déclencher toute les 30 minutes pour en virer 50 en un coups... .. .

et hop...



Pour la forme... .. . ;o)

^_^

@ tchaOo°
juki_webmaster Messages postés 947 Date d'inscription mercredi 19 novembre 2003 Statut Membre Dernière intervention 5 avril 2008 3
30 mai 2006 à 13:07
Kankrelune > "mais que tu réécris les url avec l'id de session... .. ." > j'ai dut mal m'exprimer, j'utilise l'id de sessions maison , j'utilise pas les $_SESSION, justement.


"en gros tu veux limiter le nombre de visiteurs à ton site... et il fait quoi le 11 eme internaute qui veut se connecter à ton site. " > 10 sessions / IP simultané (ip+hots), pour eviter que la db ne souffre par flood (ex: je m'identifit, je me reidentifit, 1000 fois de suite etc...), donc generer autemps de sessions inutiles.
IP+Host, pour la simple et bonne raison: une ip peut etre reatribuer, mais l'host lui theoriquement ne sera pas le meme, exemple: une IP Wanadoo, l'ip je la rajoute pour avoir quelque chose en cas où l'host n'est plus valide: une IP Wanadoo.
10 sessions/Ip : Imagine un sous reseau avec 3 pc une meme IP publique connecté à ton site, si ils perdent leurs id de session, ils vont devoir la reecrer, mais il leurs restera encore quelques essaies. Tout cela pour eviter de mettre en danger MySQL.

Et à ce que je sache, ont a pas tous la meme IP..


Et si tu ne comprend pas pourqoui il faut effacer toutes les sessions expirer (je parle des sessions coté db), c'est tout simple: tout le monde ne clique pas sur "Deconnexion".

Kankrelune, as-tu une autre <quote></quote> pour la route?
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
30 mai 2006 à 13:06
Ah oui, tel quel le système est bien plus lent à cause des requètes. Je comptais justement utiliser ce système pour une gestion de stats derrière un peu plus tard.

Mais ce soir je m'y attèle :)
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
30 mai 2006 à 12:51
Bah même en ayant optimisé ça, ça restera largement plus lent qu'un système de sessions avec fichiers. Je trouve ton système intéressant, mais ça aurait pu le faire en implémentant une gestion avec des fichiers en sauvegardant des informations supplémentaires dans le fichier session (je ne sais pas moi, le referer, etc...) en gros initialiser des variables dans la session que tu réutilises ensuite sans les avoir déclarées dans le code PHP. Faudrait trouver une application pratique à ce genre de cas mais je pense qu'un système de stats pourrait en tirer partie couplé à une classe de gestion de logs.
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
30 mai 2006 à 12:12
"j'aime bien ton script, c'est bien codé, mais qu'est-ce que c'est gourmand :-("
Vi, ca j'avais remarqué et je n'avais pas encore trouvé de solution. Le problème vient bien du SQL, je regarderai donc ca de plus près pour REPLACE INTO.

"Dans ta source, les variable de session sont auvegardées sans concervation du type (Tout est transformé en string)"
Les sessions via fichiers sont aussi sauvegardées en string, sauf que la linéarisation/délinéarisation se fait en automatique habituellement... et apparament pas ici. Je vais remédier au problème :)

"$_SESSION['insertion_SQL'] = '"; drop table session; --'; // Je suppose que tu echape dans ton abstraction SQL" Vi, l'escape_string est réalisé en automatique sur tout ce qui est chaine seulement :) ( méthode ->prepare() )


Bon dès que je fini le boulot ce soir ( pas avant 19h :p ), je m'occuperai de ce que vous avez mis plus haut :)
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
30 mai 2006 à 11:14
'Autre chose, pour des questions de performance lors de l'écriture des données. Je te propose de ne pas compter pour savoir si la variable de session est déjà présente... De toute façon tu l'écrasera.
Alors un petit coup de "delete;insert;" en une seule requète fera l'affaire.'

C'est ce que je disais juste au dessus :)
J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 10
30 mai 2006 à 10:36
Salut,


Effectivement, tu nous as plus fait un très joli tutorial qu'une source "qui-sauve-la-vie".


!!! MAIS IL MANQUE UN TRUC ESSENTIEL !!!

$_SESSION['tableau'] = array(1,2,3,4,5,6); // BUG
$_SESSION['objet'] = new DOMDocument(); // BUG

Dans ta source, les variable de session sont auvegardées sans concervation du type (Tout est transformé en string). Les tableaux, objets, ressources ne pourront être récupérées

Donc il faut serialize() à l'écriture et unserialize() à la lecture...


Autre chose, pour des questions de performance lors de l'écriture des données. Je te propose de ne pas compter pour savoir si la variable de session est déjà présente... De toute façon tu l'écrasera.
Alors un petit coup de "delete;insert;" en une seule requète fera l'affaire.


PS :
$_SESSION['insertion_SQL'] = '"; drop table session; --'; // Je suppose que tu echape dans ton abstraction SQL
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
30 mai 2006 à 10:07
Salut,

j'aime bien ton script, c'est bien codé, mais qu'est-ce que c'est gourmand :-( j'imagine pas un site un tant soit peu visité fonctionner longtemps en mutu avec ton système, t'imagines le nombre de requêtes ?

Ce code-ci pourrait être optimisé :

# // Ecriture des données de session.
# public function write($sessID,$sessData) {
#
# $this->id = $sessID;
# $newExp = time() + $this->lifeTime;
# $this->db->prepare("SELECT COUNT(id) FROM session WHERE id = '{1}'", $sessID);
# $data = $db->fetch_row();
#
# if ( (int) $data[0] !== 0 ) {
# $this->db->prepare("UPDATE session SET expires {1}, data '{2}' WHERE id = '{3}'",
# $newExp, $sessData, $sessID);
# if ( $this->db->affected_rows() === 1 ) {
# return TRUE;
# }
# } else {
# $this->db->prepare("INSERT INTO session (id, data, expires) VALUES ('{1}', '{2}', {3})",
# $sessID, $sessData, $newExp);
# if ( $this->db->affected_rows() === 1 ) {
# return TRUE;
# }
# }
#
# return FALSE;
#
# }

regarde les requêtes de type REPLACE INTO, et encore vu que tu bosses en PHP5, j'imagine que tu bosses avec une bonne version de MySQL, consulte donc (histoire d'optimiser le replace) les requêtes de type "INSERT... ON DUPLICATE KEY UPDATE", tout ton code peut être remplacé par une seule requête.

Je mets 9 parce que l'idée est intéressante :-)
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
30 mai 2006 à 00:17
Bah ca faisait un ptit moment vi :)
Ouais je sais que ca ressemble beaucoup à la doc de php, en même temps y'a pas 36 solutions pour implémenter un truc pareil lol =)

Ce que j'implémente en plus, c'est l'abstraction pour le moment. Je vais voir de nouvelles possibilitées à cette classe un peu plus tard.

J'update également, parce que ce que je vous ai mis n'est pas fonctionnel :)
Maintenant ui (testé et approuvé :))
stepibou Messages postés 112 Date d'inscription jeudi 11 mars 2004 Statut Membre Dernière intervention 11 octobre 2006
29 mai 2006 à 23:45
Salut,
bonne source , meme si je trouve que ca resemble plus à un tuto,... En effet on retrouve une grande majorité de ton code sur la page de la fct session_set_save_handler() sur fr.php.net (en comptant les commentaires des membres)

Bon, moi, je me suis vraiment pris la tete pendant des heures et des heures , pour esayer de comprendre les sessions un peu plus en detail.
Et tout ca pour rien car je viens de voir que sous windaube l'expiration de session est mal géré... (notament en utilisant l'osolete ie) . Voir ici:
http://www.manuelphp.com/php/ini.session.gc-maxlifetime.php

Sinon, pour les sessions sauvés dans les fichiers :
il faudrait gérer le : session_save_path (rep de sauvegarde)

Voila bon code!
a+

ps: lol, ca faisait longtemps que t'avait pas poster un code. quoi 17 jours , 138min et 47s ?? !! mdr
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
29 mai 2006 à 19:21
Je prefere la methode sans session tout court, j'en ait fait une assez complexe, et franchement pour les gens anti-cookies sa vaut le coup ! (au passage je url rewritise le sessid et l'id membre pour les gens amoureux du cache).


Alors là je trouve que tu te contredis... d'une par ce n'est pas parce que l'internaute n'accepte pas les cookies que tu ne pourra pas utiliser les sessions ensuite tu dis que tu utilise une methode sans sessions mais que tu réécris les url avec l'id de session... .. .

Ce que tu devrais faire:
Autoriser exemple: 10 sessions / IP simultanée, suffisent non ?


Soit j'ais rien compris à ce que tu viens de dire soit je vois pas l'interet de limiter le nombre de sessions... en gros tu veux limiter le nombre de visiteurs à ton site... et il fait quoi le 11 eme internaute qui veut se connecter à ton site... il doit attendre que les autres on finit... .. .

Ô_o

Au lancement de la class effacer toutes les sessions expirer.


C'est ce qu'il fait dans la méthode close... à l'instantiation ou à la fermeture ça ne change rien... cependant je persiste à dire qu'il n'est pas utile de le faire à chaque page ,hormis pour des gros gros sites qui de par le nombre de visiteurs générent des paquets de sessions, mieux vaut développer une methode pour lancer le gc de manière périodique mais pas à chaque fois... ne serait ce qu'un...

if(time()%2)
$this->gc();

Ca fait toujours ça de requêtes en moins... c'est pas un point crucial mais c'est toujours ça de gagné... .. . ;o)

@ tchaOo°
juki_webmaster Messages postés 947 Date d'inscription mercredi 19 novembre 2003 Statut Membre Dernière intervention 5 avril 2008 3
29 mai 2006 à 19:04
Je prefere la methode sans session tout court, j'en ait fait une assez complexe, et franchement pour les gens anti-cookies sa vaut le coup ! (au passage je url rewritise le sessid et l'id membre pour les gens amoureux du cache).

Ce que tu devrais faire:
Autoriser exemple: 10 sessions / IP simultanée, suffisent non ?
Au lancement de la class effacer toutes les sessions expirer.

Si cette methode te plait, envisage-là car sa pourais tres bien la faire avec ta class.

Jolie source :)
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
29 mai 2006 à 16:10
Oh voui, jfais passer des paramètres qui ne servent à rien :)

Quel gland des fois :p

Pour le gc, je sais plus, jvais revoir ca de plus près. Merci de m'y avoir fait penser.
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
29 mai 2006 à 16:01
Hello... bonne classe bien écrite... .. .

Petit bémol au niveau du gc... je ne suis pas sur qu'il soit utile de le faire à chaque fermeture en outre la variable $sessMaxLifeTime que tu lui passe en paramètre ne sert à rien... .. .

A part ça de ce que j'ais vu c'est du bon boulot... .. . ;o)

@ tchaOo°
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
29 mai 2006 à 15:28
Hello,

c'est beau :-)
Et très utile. Bonne classe :-) Rien à redire, personnellement.