Accueil > > > PHP5 - CLASSE DE GESTION DE SESSION
PHP5 - CLASSE DE GESTION DE SESSION
Information sur la source
Description
Huhu, bon ca faisait longtemps que j'avais pas posté un ptit code alors voila :) Déja, avec un titre aussi compliqué (quoi que), je vais essayer de m'exprimer en bon français. Tout le monde connait les sessions. On commence par appeler session_start(), et on utilise $_SESSION[] par la suite. Petit rappel de fonctionnement, les données de sessions sont stockées sur le disque dur du serveur dans un fichier pour chaque visiteur. Cependant, pour une envie comme une autre on désire utiliser un système de base de donnée au lieu d'un système via fichier. On pourrait écrire une classe qui fasse ca avec un parsing comme je l'avais fait il y a bien longtemps (que je n'ai jamais fini). Cependant, le procédé est bien trop lourd. Comment faire pour mixer performance d'une base de donnée avec la performance des sessions sans tout ré-écrire ? Via session_set_save_handler(). Il suffit de recréer les méthodes dont on a besoin pour les faires intéragir avec une base de donnée plutôt qu'avec un système de fichier. Et grâce à tout ca, on peut utiliser session_start, $_SESSION[] et toutes les fonctions session_*. Pour pouvoir utiliser correctement l'approche objet de PHP5, j'ai découpé ce projet en 2. La première partie est une classe abstraite. Toute classe de session DOIT être dérivée de cette classe abstraite. Elle contient les méthodes nécessaires au bon fonctionnement des sessions. (ainsi que les propriétés utiles pour chaque classe dérivée). La deuxième partie est une classe concrète. Ici, j'ai choisi de faire une classe concrète de base de donnée. Je reprend donc les méthodes abstraites pour les compléter comme prévu. On peut utiliser n'importe quel système pour les sessions, que ce soit un gestionnaire LDAP, une base de donnée SQL, nu système de fichier bref... il suffit pour cela de dériver la classe abstraite et de remplir les méthodes. Voici donc ce que ca donne.
Source
- <?php
- abstract class SessionManager {
-
- public $session_name;
- public $lifeTime = 3600;
-
- public $id;
-
- abstract public function open($savePath, $sessName);
- abstract public function close();
- abstract public function read($sessID);
- abstract public function write($sessID,$sessData);
- abstract public function destroy($sessID);
- abstract public function gc($sessMaxLifeTime);
-
- public function __construct() {
-
- if ( !session_set_save_handler(array(&$this,'open'),
- array(&$this,'close'),
- array(&$this,'read'),
- array(&$this,'write'),
- array(&$this,'destroy'),
- array(&$this,'gc') ) ) {
- throw new Exception('Erreur lors de l\'init des sessions !');
- }
-
- session_start();
-
- }
- }
-
- class SQLSessionManager extends SessionManager {
-
- private $db;
-
- public function __destruct() {
- session_write_close();
- }
-
- public function open($savePath, $sessName) {
-
- $this->db = mysql::GetInstance();
- return true;
-
- }
-
- public function close() {
-
- $this->gc(ini_get('session.gc_maxlifetime'));
- unset($this->db);
-
- }
-
- public function read($sessID) {
-
- $this->id = $sessID;
- $this->db->prepare("SELECT data FROM session WHERE id = '{1}' AND expires > {2}",
- $sessID, time() );
- $this->db->query();
-
- return ( ( $row = $this->db->fetch_row() ) !== FALSE ) ? $row[0] : ' ';
-
- }
-
- public function write($sessID,$sessData) {
-
- $this->id = $sessID;
- $newExp = time() + $this->lifeTime;
- $this->db->prepare("INSERT INTO session (id, data, expires) VALUES ('{1}', '{2}', {3})
- ON DUPLICATE KEY UPDATE data = '{2}', expires = {3}",
- $sessID, $sessData, $newExp);
- $this->db->query();
-
- return TRUE;
-
- }
-
- public function destroy($sessID) {
-
- $this->db->prepare("DELETE FROM session WHERE id = '{1}'", $sessID);
- $this->db->query();
- return ( $this->db->affected_rows() === 1 ) ? TRUE : FALSE;
-
- }
-
- public function gc($sessMaxLifeTime) {
-
- $this->db->prepare("DELETE FROM session WHERE ( UNIX_TIMESTAMP(expires) - UNIX_TIMESTAMP(NOW()) ) > '{1}' ", $sessMaxLifeTime);
- $this->db->query();
- return $this->db->affected_rows();
-
- }
-
- }
- ?>
<?php
abstract class SessionManager {
public $session_name;
public $lifeTime = 3600;
public $id;
abstract public function open($savePath, $sessName);
abstract public function close();
abstract public function read($sessID);
abstract public function write($sessID,$sessData);
abstract public function destroy($sessID);
abstract public function gc($sessMaxLifeTime);
public function __construct() {
if ( !session_set_save_handler(array(&$this,'open'),
array(&$this,'close'),
array(&$this,'read'),
array(&$this,'write'),
array(&$this,'destroy'),
array(&$this,'gc') ) ) {
throw new Exception('Erreur lors de l\'init des sessions !');
}
session_start();
}
}
class SQLSessionManager extends SessionManager {
private $db;
public function __destruct() {
session_write_close();
}
public function open($savePath, $sessName) {
$this->db = mysql::GetInstance();
return true;
}
public function close() {
$this->gc(ini_get('session.gc_maxlifetime'));
unset($this->db);
}
public function read($sessID) {
$this->id = $sessID;
$this->db->prepare("SELECT data FROM session WHERE id = '{1}' AND expires > {2}",
$sessID, time() );
$this->db->query();
return ( ( $row = $this->db->fetch_row() ) !== FALSE ) ? $row[0] : ' ';
}
public function write($sessID,$sessData) {
$this->id = $sessID;
$newExp = time() + $this->lifeTime;
$this->db->prepare("INSERT INTO session (id, data, expires) VALUES ('{1}', '{2}', {3})
ON DUPLICATE KEY UPDATE data = '{2}', expires = {3}",
$sessID, $sessData, $newExp);
$this->db->query();
return TRUE;
}
public function destroy($sessID) {
$this->db->prepare("DELETE FROM session WHERE id = '{1}'", $sessID);
$this->db->query();
return ( $this->db->affected_rows() === 1 ) ? TRUE : FALSE;
}
public function gc($sessMaxLifeTime) {
$this->db->prepare("DELETE FROM session WHERE ( UNIX_TIMESTAMP(expires) - UNIX_TIMESTAMP(NOW()) ) > '{1}' ", $sessMaxLifeTime);
$this->db->query();
return $this->db->affected_rows();
}
}
?>
Conclusion
Et voila. Un gros merci à la doc de PHP la dessus sur lequel j'ai pris exemple. Je compte rajouter de nouveaux trucs, mais la base est la en tout cas. Si ca peut aider quelqu'un tant mieux :)
J'ai oublié, mes méthodes de singletons peuvent se retrouver dans la classe abstraite ca ne posera aucun problème :)
Historique
- 30 mai 2006 00:20:28 :
- Update, avant ca marchait pas. Maintenant oui :)
- 01 juin 2006 20:13:22 :
- Remplacement du code SQL via ON DUPLICATE KEY - le gc qui marchait pas bien (je compte lui faire quelque chose de nouveau à ce machin, ca me plait pas encore) - mais j'ai oublié le singleton :p
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
problème avec les sessions [ par lpefec ]
mon script ne fonctionne pasidentification.php----------------------------------------------------------------<html><head><title>Log
problème avec les sessions [ par lpefec ]
mon script ne fonctionne pasidentification.php----------------------------------------------------------------<html><head><title>Log
$_session et IE (cookies de session) !! [ par rocknroll2 ]
J'ai un site avec PHP et SQL, Mes $_session ne fonctionnent que si l'utilisateur coche "accepter les cookies de session" dans sa configuration d'IE !
Erreur de session [ par Tilix ]
Salut, Pour testé mon mini système d'authentification, j'veux affiché l'ID authentifié sur la page d'accueil J'ai donc : AUTH
Problème de redirection [ par jipe32 ]
Bonsoir, j'ai un code qui redirige vers une autre page si la quantité demandé dans le formulaire précédent dépasse la quatité disponnible (je fais un
Garder les variables de sessions [ par Anthotill ]
Bonjour à tous;J'ai un probleme pour garder lors d'un parcours sur mon site les variables de session.Dans une BDD j'ai un champ userid en autoincremen
Probleme session [ par Anthotill ]
Bonjour à tous J'ai un probleme avec les sessions dans mes pages.Je précise que ma base de donnée se trouve sur un https:// ...A chaque début de page,
pbroblème de session [ par Miss1 ]
Salut,je veux crée une session pour que l'utilisateur puisse accédé a son compte panier.Le probleme qui intervien' c'est que quand je rentre acun log
Liste de membres [ par biloutte33 ]
Bonjour tout le monde,suite à mon espace membre qui est actif, j'aimerais que l'on puisse consulter les fiches des membres avec leurs informations res
Projet PHP5/SQL [ par alexgeek ]
Bonjour,Je suis débutante en PHP et j'ai un projet en php my sql à faire puisque je suis en stage, si quelqu'un pouais m'aider à le faire je lui serai
|
Derniers Blogs
GESTION D'EXCEPTION AVEC LES TASKSGESTION D'EXCEPTION AVEC LES TASKS par richardc
Nous avons vu dans un précédent article comment utiliser Task pour effectuer des opérations dans un autre thread.
Malheureusement, comme tout le monde n'est pas parfait, il se peut que cette exécution se passe mal et qu'une exception se produise.
La...
Cliquez pour lire la suite de l'article par richardc DéMARRONS AVEC LES TASKSDéMARRONS AVEC LES TASKS par richardc
Que vous le vouliez ou non, le développement multi-tâche est maintenant une obligation pour toute nouvelle application. Il est donc vital d'en comprendre les mécanismes et de s'y mettre le plus tôt possible.
En attendant le .NET Framework 4.5 avec le...
Cliquez pour lire la suite de l'article par richardc SLIDE & DéMO TECHDAYS 2012 - FAST & FURIOUS XAML APPSSLIDE & DéMO TECHDAYS 2012 - FAST & FURIOUS XAML APPS par Vko
Retrouvez les slides et les démo de ma session Fast & Furious XAML Apps. A ceux qui se posent la question : "est-ce que le code de la DataGrid est disponible?", je vous répondrais "pas encore". Je vais mettre en place un projet codeplex pour part...
Cliquez pour lire la suite de l'article par Vko XNA IS DEAD!XNA IS DEAD! par richardc
Depuis la semaine dernière (et grâce aux TechDays 2012), je me penche activement sur la nouvelle version de Windows, aka Windows 8. Vous me direz, il était temps puisque la première preview date de Septembre dernier.
OK. Remarquez, on n'en est qu'aux...
Cliquez pour lire la suite de l'article par richardc TECHDAYS PARIS 2012 : WINDOWS SERVER "8" QUOI DE 9 !TECHDAYS PARIS 2012 : WINDOWS SERVER "8" QUOI DE 9 ! par ROMELARD Fabrice
Speakers: Fabrice Meillon et Stanislas Quastana Cette session est basée entièrement sur celle donnée lors de la BUILD cet hiver. Il n'y a pas d'ajout d'information en rapport avec cet évènement passé. Windows 8 Server sera intégralem...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
DocTranslate (V3.1.0.0)DOCTRANSLATE (V3.1.0.0)DocTranslate est un traducteur de document Microsoft Word, PowerPoint et Excel. Il permet d'autom... Cliquez pour télécharger DocTranslate Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System
|