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();
В следующей статье я поясню, как назначить обработчиком сессии... базу данных! Как говориться - "Оставайтесь с нами... ":)
Информация копипастерам
Внимание! Копирование контента с сайта, возможно только с разрешения администратора. Т.е. Меня! Я скорее всего разрешу Вам это сделать, в обмен на живую ссылку, на статью оригинал.