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 секунд.