Ostanio pisałem własną obsługe sesji opartą na bazie mysql. Oto kod:
<?php /** *@author Apo *@package Obsluga sesji */ require_once('db.php'); db::connect('localhost', 'root', '', 'session'); $session = new session(); // przykład $session->imie = 'Alfred'; try { } catch(SessionException $e) { } // klasa final class session { // unikalny numer identyfikacyjny uzytkownika private $id = null; // nazwa tabeli w bazie danych gdzie beda trzymane sesje private $table = '`session`'; // ilosc czasu (w sekundach) przez jaką ma być wazna sesja private $limit = 3600; // tablica z danymi /** * Konstruktor sprawdza czy dany uzytkownik ma juz utworzoną sesje, jesli nie je
st ona tworzona * */ public function __construct() { $this->id = $this->hash(); if(!$this->getSessionRows()) $this->createSession(); } /** * Tworzy unikalny numer identyfikacyjny dla kazdego uzytwownika * * return String */ private function hash() { } /** * Sprawdza czy uzytkownik ma utworzona sesje na podstawie ilosci rekordow w bazi
e * * return Boolean */ private function getSessionRows() { db::query('SELECT `czas`, `dane` FROM '.$this->table.' if(db::num_rows() == 1) { $dane = ''; while($array = db::fetch_row()) $dane = $array; return true; } else return false; } /** * Tworzy sesje dla uzytkownika * * return query */ private function createSession() { db::query('DELETE FROM '.$this->table.' WHERE id=''.$this->id.'''); return db::query('INSERT INTO '.$this->table.'(`id`, `czas`) VALUES(''.$this->id.'', ''.time().'')'); } /** * Przychwytuje przypisywanie wartosci do niezdefiniowanych skladowych i dodaje d
o tablicy ktora zostanie zapisana * */ public function __set($name, $value) { return $this->sessionTable[$name] = $value; } /** * Przychwytuje niezdefiniowane metody i wywoluje odpowiedni klucz z tablicy * * return String, Int */ public function __get($name) { return $this->sessionTable[$name]; throw new SessionException('Nie zdefiniowano klucza: '.$name); } /** * Niszczy sesje dla danego uzytkownika * */ public function destroy() { return db::query('DELETE FROM '.$this->table.' WHERE `id`=''.$this->id.'''); } /** * Zapisuje zserializowane dane do bazy * */ public function __destruct() { db::query('UPDATE '.$this->table.' SET `czas`='.time().', dane=''.serialize($this->sessionTable).'' WHERE `id`=''.$this->id.'''); } } class SessionException extends Exception {} /* TABELA CREATE TABLE `session` ( `id` varchar(32) default NULL, `czas` int(11) default NULL, `dane` longtext, UNIQUE KEY `id` (`id`) ) TYPE=MyISAM; */ ?>
No i chciałem się zapytać co sądzicie o takim rozwiązaniu. Muszę jeszcze popracować nad zmniejszeniem ilości zapytań, bo w aktualnej chwili wynoszą średnio one 3.
Pozdrawiam