PHP: Свои обработчики сессии
Иногда нам не хватает того, или иного функционала. Когда речь идёт о каком либо классе в контексте ООП для этого можно например, расширить этот класс наследованием, а лучше создать композицию из нескольких классов и т.п. А как быть скажем, с сессиями? Точнее с механизмом сессий в PHP, если мы задумали сделать с сессиями, что то не тривиальное? Например разнести сайт на несколько серверов...
Что бы взять под контроль функционал сессий в php, нужно написать свои обработчики событий для сессии, т.е. определить обработчики следующих событий:
- Открытия сессии ( происходит при вызове session_start() )
- Закрытия сессии ( когда мы уходим со страницы )
- Чтения данных сессии ( происходит после вызова session_start() )
- Записи данных сессии ( происходит когда мы что то пишем в сессию )
- Уничтожения сессии (происходит при вызове session_destroy() )
- Сборщик мусора ( происходит время от времени )
Для обработки этих событий нам потребуются создать шесть callback функций, и передать их имена в функцию session_set_save_handler(). Callback функции должны принимать и возвращать определённые данные в принципе в коде всё должно быть понятно, но ниже я ещё поясню.
Определяем свой обработчик сессии
function sess_open( /* str */ $sess_path, /* str */$sess_name)
{
echo'Сессия открыта<br />';
echo'Путь сессии: '.$sess_path.'<br />';
echo'Имя сессии: '.$sess_name.'<br />';
return true;
}
function sess_close()
{
echo'Сессия закрыта<br />';
return true;
}
function sess_read( /* str */ $sess_id)
{
echo'Сессия прочитана<br />';
echo'ID сессии: '.$sess_id.'<br />';
return '';
}
function sess_write( /* str */ $sess_id, /* str */ $data)
{
echo'Сессия записана<br />';
echo'ID сессии: '.$sess_id.'<br />';
echo'Данные: '.$data.'<br />';
return true;
}
function sess_destroy( /* str */ $sess_id)
{
echo'Сессия уничтожена<br />';
return true;
}
function sess_gb( /* str */ $sess_maxlifetime)
{
echo'Запущен сборщик мусора<br />';
echo'Время жизни сессии: '.$sess_maxlifetime.'<br />';
return true;
}
Теперь осталось сказать PHP, что сессии мы берем на себя - их обрабатывают наши функции:
// Здесь задаём свои обработчики, описанные выше:
session_set_save_handler('sess_open',
'sess_close',
'sess_read',
'sess_write',
'sess_destroy',
'sess_gb' );
session_start();
$_SESSION['alpha'] = 'mysession';
session_write_close();
Этот код выведет следующие строки:
Сессия открыта
Путь сессии: /tmp
Имя сессии: PHPSESSID
Сессия прочитана
ID сессии: 712e2aa2723734404fea64a530185d7e
Сессия записана
ID сессии: 712e2aa2723734404fea64a530185d7e
Данные: alpha|s:9:"mysession";
Сессия закрыта
Здесь нужно кое что пояснить: все функции должны возвращать логическое true, за исключением функции sess_read(). Требуется что бы из неё были возвращены данные, или пустая строка в противном случае произойдёт сбой.
Ну, с этим вроде разобрались. Я не случайно начал эту статью с упоминания об ООП. Ниже представлен листинг для любителей ООП ( коим является и Ваш покорный слуга ), в котором весь функционал обработки сессии "завёрнут" в соответствующий класс. Обратите внимание, как здесь передаются методы класса, в качестве callback функций.А ещё, если вы не успели заметить, callback функциям мы даем имена, которые придумали сами.
Определяем свой обработчик сессии в стиле ООП
class SessionHandler
{
protected $savePath;
protected $sessionName;
public function __construct() {
session_set_save_handler(
array($this, 'open'),
array($this, 'close'),
array($this, 'read'),
array($this, 'write'),
array($this, 'destroy'),
array($this, 'gc')
);
}
public function open($savePath, $sessionName) {
$this->savePath = $savePath;
$this->sessionName = $sessionName;
return true;
}
public function close() {
// ... Ваш код ...
return true;
}
public function read($id) {
// ... Ваш код ...
return "";
}
public function write($id, $data) {
// ... Ваш код ...
return true;
}
public function destroy($id) {
// ... Ваш код ...
return true;
}
public function gc($maxlifetime) {
// ... Ваш код ...
return true;
}
}
new SessionHandler();
В следующей статье я поясню, как назначить обработчиком сессии... базу данных! Как говориться - "Оставайтесь с нами... ":)
Информация копипастерам
Внимание! Копирование контента с сайта, возможно только с разрешения администратора. Т.е. Меня! Я скорее всего разрешу Вам это сделать, в обмен на живую ссылку, на статью оригинал.
PHP: Свои обработчики сессии
