PHP: Свои обработчики сессии

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: Буферизация вывода

Буферизация вывода в PHP это довольно полезная штука, если уметь ею пользоваться. Скажите сколько раз

POP3 протокол с примерами

POP3 это протокол по которому мы можем получить почту с сервера, для подобной задачи, используется

PHP: Хранение сессии в базе данных

Как и обещал, тема данной заметки: база данных, как обработчик сессии. А так как на