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();
}

4 Комментарии “MySQL Session Manager

Комментарии закрыты