MySQL Session Manager
Для создания этого сайта мне нужен был класс для управления сессией так как я не хотел использовать обычный механизм, хранения в файлах, а использовать базу данных.
Прежде чем писать свой я решил обратиться к мудрости всезнающего Google и нашел более менее подходящий класс, написанный человеком по имени Robin Schuil. Он был простой и быстрый но использовал сразу несколько баз данных для хранения информации, поэтому я взялся его переделать.
И вот что у меня получилось:
class session {
public $lt; // int
public $db; // obj
public function __construct(&$db)
{
$this->db = &$db;
// Read the maxlifetime setting from PHP
$this->lt = get_cfg_var("session.gc_maxlifetime");
// Register this object as the session handler
session_set_save_handler(
array( $this, "open" ),
array( $this, "close" ),
array( $this, "read" ),
array( $this, "write"),
array( $this, "destroy"),
array( $this, "gc" )
);
}
public function start()
{
session_start();
}
public function stop()
{
session_unset();
session_destroy();
}
public function prolong($id,$sttl)
{
$this->lt += $sttl;
$data = $this->db->Execute("UPDATE `sessions` SET `expires` = UNIX_TIMESTAMP() + '" . $this->lt . "' WHERE `id` = '" . addslashes( $id ) . "';");
return (bool)$data->RecordCount();
}
public function open($save_path, $session_name)
{
return true;
}
public function close()
{
return true;
}
public function read($id)
{
$data = $this->db->Execute("SELECT `data` FROM `sessions` WHERE `id` = '" . addslashes( $id ) . "' AND `expires` > UNIX_TIMESTAMP();");
return $data->fields['data'];
}
public function write($id,$data)
{
$data = $this->db->Execute("INSERT `sessions` (`id`,`data`,`initiation`,`expires`) VALUES( '" . addslashes( $id ) . "', '" . addslashes( $data ) . "', UNIX_TIMESTAMP() , UNIX_TIMESTAMP() + " . $this->lt . ") ON DUPLICATE KEY UPDATE data = '" . addslashes( $data ) . "', expires = UNIX_TIMESTAMP() + " . $this->lt . ";");
return (bool)$data->RecordCount();
}
public function destroy($id)
{
$data = $this->db->Execute("DELETE FROM `sessions` WHERE `id` = '" . addslashes( $id ) . "';");
return (bool)$data->RecordCount();
}
public function gc()
{
$data = $this->db->Execute("DELETE FROM `sessions` WHERE `expires` <= UNIX_TIMESTAMP();");
return true;
}
public function __destruct()
{
$this->db = null;
}
}
Для хранения сессий используеться MySQL, а как DBAL используеться ADOdb, хотя по желанию ее можно заменить любой другой изменив названия функций Execute и RecordCount на соответствующие.
Естественно чтобы использовать этот класс нужно создать новую таблицу, вот ее структура.
CREATE TABLE `sessions` (
`id` varchar(32) NOT NULL,
`data` text NOT NULL,
`initiation` int(11) NOT NULL,
`expires` int(11) NOT NULL,
UNIQUE KEY `id` (`id`),
KEY `DATE` (`initiation`,`expires`)
) ENGINE=MyISAM DEFAULT CHARSET=UTF8;
Ну и конечно пример использования.
$session = new session();
$session->start();
if (true){ // например если пользовает залогинелся
$_SESSION['login'] = 'login';
$_SESSION['data'] = 'user data';
$session->prolong($_SESSION['id'],3600);
}else{ // или наоборот если вышел
$session->close();
}
Свежие комментарии