Zend Session и Истекшие Пространства Имен

У меня есть 2 области, которые нуждаются в управлении сессиями, с 2 различными истечениями:

  • Административный район - 20 минут
  • Зона бронирования - 3 минуты

С помощью Zend_SessionКак я могу управлять обоими для одного и того же пользователя?

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

Моя текущая реализация использует Zend_Session_SaveHandler_DbTable и я хотел бы придерживаться этого, если это возможно.

Я храню Session_ID из основной таблицы сеансов в таблице резервирования, чтобы указать бронирования. Это хорошо работает, потому что позволяет мне использовать сборку мусора для очистки заброшенных сеансов (у меня есть cron, запускающий сборку мусора каждую минуту).

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

2 ответа

Решение

Я думаю, что вам нужно что-то на уровне приложений, чтобы управлять этими резервированиями, а не полагаться на сам сеанс. Трудно "что-то делать", когда сеансы истекают, и я бы сказал, что сессии не предназначены для того, чтобы зависеть от такого рода функциональности.

Я предлагаю вам создать отдельную таблицу с токенами резервирования. Они будут иметь уникальный хеш-токен в качестве первичного ключа, дату истечения срока действия и, возможно, необязательный идентификатор пользователя. Вместо того, чтобы хранить Session_ID в таблице резервирования, вы вместо этого сохраняете токен с тем же ограничением (поэтому удаление токена освобождает резервирование). Вы добавляете дополнительное задание cron с токенами, срок действия которых истекает - это может быть так же просто, как выполнить DELETE FROM reservation_tokens WHERE expires < NOW() запрос. В сеансе вы сохраняете токен, и проверка времени истечения срока действия токена покажет вам, действует ли резервирование по-прежнему или нет.

Таким образом, срок действия вашего бронирования больше не зависит от истечения сеанса. Это также позволило бы таким вещам, как вошедший в систему пользователь, который по-прежнему имеет такое же резервирование, если он должен был войти снова (до истечения срока резервирования).

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

// assuming $result is a Zend_Auth_Result
if ($result->isValid()) {
    // extend the user's session
    $lifetime = 1200;
    ini_set('session.cookie_lifetime', $lifetime);
    Zend_Session::rememberMe($lifetime);
}

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

Ты можешь использовать setExpirationSeconds метод в Zend_Session_Namespace.

$session->setExpirationSeconds(10);

по истечении 10 секунд.

Другие вопросы по тегам