Witam
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
private $sessionTable = array();
/**
* 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()
{
return md5($_SERVER['REMOTE_ADDR'] . addslashes($_SERVER['HTTP_USER_AGENT'])); }
/**
* 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.'
WHERE `id`=''.$this->id.'' AND `czas`>'.(time()-$this->limit));
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