Zend_Session и Expiration
Мне нужно установить очень короткую сессию (3 минуты) после перехода на определенную страницу на моем сайте. Если кто-то снова перейдет на эту страницу во время этого 3-минутного сеанса, сеанс должен обновиться до истечения 3 минут с этого времени.
На моей "начальной загрузке" (это не обычная загрузочная версия Zend, но она включена на каждой странице) я делаю следующее:
$aSessionSaveHandlerConfig = array
(
"name" => "Sessions",
"primary" => "Session_ID",
"modifiedColumn" => "UpdateTimestamp",
"dataColumn" => "Data",
"lifetimeColumn" => "Lifetime",
);
$oSaveHandler = new Zend_Session_SaveHandler_DbTable($aSessionSaveHandlerConfig);
$oSaveHandler->setLifetime(App::$ReservationTimeout)->setOverrideLifetime(true);
Zend_Session::setSaveHandler($oSaveHandler);
ini_set("session.cookie_lifetime",App::$ReservationTimeout);
$aSessionOptions = array
(
"gc_probability" => 100,
"gc_divisor" => 100,
"gc_maxlifetime" => App::$ReservationTimeout,
"cookie_lifetime" => App::$ReservationTimeout,
);
Zend_Session::setOptions($aSessionOptions);
Затем на странице, которая должна создать / обновить сеанс, у меня есть:
App::$ReservationSession = new Zend_Session_Namespace("ReservationSession");
$oSaveHandler = Zend_Session::getSaveHandler();
$oSaveHandler->setLifetime(App::$ReservationTimeout);
Я вижу записи в базе данных, столбец времени жизни правильный, но если я неоднократно посещаю страницу, которая создает / обновляет сеанс, я получаю новый идентификатор сеанса через 3 минуты (а другой удаляется после сборки мусора).
Похоже, проблема в том, что cookie-файл обновил свое время. Есть идеи?
1 ответ
Чтобы заставить куки сеанса обновлять время его истечения, вы можете использовать Zend_Session:: RememberMe(), чтобы изменить время жизни куки по умолчанию. призвание rememberMe()
также вызовет Zend_Session::regenerateId()
вызывается, который генерирует новый идентификатор сеанса, копирует старые данные сеанса в новый сеанс и отправляет новый cookie сеанса в браузер.
Попробуйте следующий код и посмотрите, решит ли он вашу проблему:
App::$ReservationSession = new Zend_Session_Namespace("ReservationSession");
$oSaveHandler = Zend_Session::getSaveHandler();
$oSaveHandler->setLifetime(App::$ReservationTimeout);
// Call remember me which will send a new session cookie with 3 minute expiration
// from the current time. Old session data is copied to the new one and the old
// session is deleted
Zend_Session::rememberMe(App::$ReservationTimeout);
Обратитесь к разделу руководства по идентификаторам сеансов для получения дополнительной информации или см. Также Как сбросить функцию Zend RememberMe при каждом автоматическом входе в систему?
ОБНОВЛЕНИЕ: учитывая ваш комментарий, я придумал это решение, которое вы можете использовать.
То, что это делает, это запускает ваш сеанс как обычно, а затем проверяет значение в сеансе, чтобы увидеть, имел ли пользователь существующий сеанс.
Если у них есть сеанс, он использует setcookie() для отправки обновленного файла cookie сеанса, используя существующие параметры (включая идентификатор сеанса), за исключением того, что устанавливает срок действия в time() + $ReservationTimeout
, Если у них не было сеанса, то нет необходимости обновлять cookie, так как срок действия уже правильный, и он будет обновляться при следующем запросе (при условии, что они посещают до истечения срока его действия).
App::$ReservationSession = new Zend_Session_Namespace("ReservationSession");
$oSaveHandler = Zend_Session::getSaveHandler();
$oSaveHandler->setLifetime(App::$ReservationTimeout);
if (!isset(App::$ReservationSession->hasSession)) {
// user had no session before or it was expired
App::$ReservationSession->hasSession = true;
} else {
// user has a valid session, update the cookie to expire 3 mins from now
$params = session_get_cookie_params();
$expire = time() + App::$ReservationTimeout;
setcookie(session_name(),
Zend_Session::getId(),
$expire,
$params['path'],
$params['domain'],
$params['secure'],
$params['httponly']);
}
Я протестировал решение с помощью обработчика файловых сессий, и оно сработало, как и ожидалось, я думаю, что оно также подойдет для вашей ситуации.