Сессии в PHP5 - встроенные сессии или нет? - PullRequest
4 голосов
/ 10 февраля 2011

Фон:
Я нахожусь на стартовой площадке нового проекта, построенного на PHP5.3. Я только начал изучать способы обработки сессий таким образом, который изначально позволяет мне сохранять сессии в базе данных. Я разделю все управление сессиями в отдельную библиотеку, чтобы упростить миграцию на отдельный * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *, или 100% * *.

Я немного растерялся из-за того, что было бы хорошим подходом - в Интернете есть много разных идей о том, как обрабатывать сессии в зависимости от версии PHP, и чем больше я читаю, тем больше путаюсь.

Вопрос:
Вот варианты, которые я считаю наиболее подходящими. Какой я должен использовать и почему? Есть ли другие альтернативы, которые следует рассмотреть?

Вариант 1:
Использование session_set_save_handler и создание пользовательских функций для каждого события сеанса, чтобы в полной мере использовать встроенную (встроенную) обработку сеансов PHP, но при этом сохранять сеансы в базе данных. Сессия будет записана как $_SESSION['identifier'] = 'value';.

Вариант 2:
Создание полного класса сессий, который не будет иметь ничего общего с сессиями PHP и будет действовать как любая модель базы данных, взаимодействующая с таблицей sessions в моей базе данных. Сессия будет написана как $this->sessions->write('identifier', 'value');.

Ответы [ 2 ]

8 голосов
/ 10 февраля 2011

Суперглобальный $_SESSION на самом деле довольно хорошая функция в PHP.

В зависимости от того, каким будет ваше программное решение, сторонние пользователи будут более склонны писать и читать из этого суперглобального элемента, когда ваши пользовательские обработчики сеансов выполняют магию в фоновом режиме.

С помощью Suhosin также доступны хорошие улучшения безопасности, о которых вам не нужно «беспокоиться» при разработке хранилища сеансов для себя.

2 голосов
/ 10 февраля 2011

Я бы посоветовал вам пойти по последнему маршруту, но с крутым поворотом.

Создайте класс Session, затем используйте шаблон адаптера, чтобы расширить его классами DatabaseSession и CookieSession.

На мой взгляд, переопределение session_save_handler кажется слишком большим взломом.

Маршрутизация всех взаимодействий, связанных с сеансами, через ваш класс-оболочку дает вам гораздо большую гибкость, так как проект становится все больше и больше.

Примерно так:

interface SessionAdaptor {
   function write($key, $data, $timeout);
   function read($key);
   function key_exists($key);
}

class Session {
  private $adaptor;

  function __construct(SessionAdaptor $adaptor) {
     $this->adaptor = $adaptor;
  }

  //here we go:

  function write($key, $data, $timeout) {
     return $this->adaptor->write($key, $data, $timeout);
  }

  function read($key) {
     return $this->adaptor->read($key);
  }

  function key_exists($key) {
     return $this->adaptor->key_exists($key);
  }
}

class DatabaseSession implements SessionAdaptor {
   //...
}

class CookieSession implements SessionAdaptor {
   //...
}

Использование:

$database_session = new Session(new DatabaseSession());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...