Можно только предположить причины, по которым они предложили эту функцию, но я также не вижу каких-либо серьезных причин ее использования.Множество языков программирования дают вам возможность делать что-то плохое или писать код, который имеет невидимые негативные побочные эффекты.
Конечно, могут быть непредвиденные последствия, если кто-то произвольно установит его на очень большое значение, но Следует отметить, что данные сеанса по-прежнему подлежат сборке мусора на основе session.gc_maxlifetime независимо от времени rememberMe
, установленного для файла cookie.Вызов Zend_Session::rememberMe()
не влияет на сборку мусора для этих данных.
Обратите внимание на следующее:
Bootstrap.php
protected function __initSession() {
ini_set('session.gc_maxlifetime', 45); // set session max lifetime to 45 seconds
ini_set('session.gc_divisor', 1); // 100% chance of running GC
Zend_Session::start();
}
IndexController.php
public function indexAction() {
$data = new Zend_Session_Namespace('data');
if (!isset($data->time)) {
// no active session - set cookie lifetime and set some data
Zend_Session::rememberMe(90*86400); // 90 days
$data->time = time();
echo "Setting time";
} else {
echo date('r', $data->time);
}
}
Если бы вы получили доступ к IndexController
, в первый раз вы бы увидели Setting time
.Затем, если вы будете ждать более 45 секунд, вы увидите распечатанное время и (в моем случае) по следующему запросу сеанс истек.Данные сеанса удаляются с сервера, и, хотя у меня все еще есть предыдущий файл cookie, он больше не распознается сервером.
Я ожидаю, что если бы вы реализовывали обратный вызов сборки мусора в обработчике сохранения сеанса,тогда вы все равно должны увидеть старые данные сеанса, удаленные из вашей базы данных, в зависимости от того, на что установлена ваша gc_maxlifetime
.
Чтобы ответить на ваши 2 вопроса:
Что касается вашей первой проблемы, я бывопрос, почему 50000 неактивных сеансов ухудшают производительность.Если база данных правильно проиндексирована по идентификатору сеанса, она должна быть очень быстрой для получения данных сеанса, даже если в базе данных были миллионы сеансов.Возможно, вы столкнулись с аппаратным ограничением?Выбор данных из 50 000 записей при правильном выполнении должен иметь небольшие накладные расходы.
Что касается вашего второго вопроса, я согласен с Майком, вам следует сохранить значение сеанса, указывающее, когда был последний визит, таким образом, когда вы начинаетесеанс вы можете проверить их последний визит и посмотреть, сколько времени прошло с момента их последнего просмотра страницы.Затем, основываясь на вашем пороговом значении, вы можете определить, возвращаются ли они на ваш сайт после неактивности.
По соображениям безопасности, если вы обнаружите, что это было так давно с момента их последнего посещения, это хорошее время для повторногопозвоните по номеру rememberMe()
, поскольку при этом будет создан новый файл cookie, что поможет предотвратить перехват и фиксацию сеанса.