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

В следующей статье я поясню, как назначить обработчиком сессии... базу данных! Как говориться - "Оставайтесь с нами... ":)

Добавить комментарий


Защитный код
Обновить



Кто на сайте
Сейчас 44 гостей онлайн