Как справиться с уничтожением сеанса в Zend Framework?

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

Например, при уничтожении сеанса я хочу обновить таблицу БД?

Я предпочитаю не использовать задание cron, так как оно будет сильно нагружать сервер.

Заранее спасибо.


person elibanon    schedule 14.09.2011    source источник
comment
Насколько это важно для вас? Для этого существует встроенный механизм, но вам необходимо найти баланс между производительностью и наличием актуальной информации.   -  person Jon    schedule 14.09.2011
comment
Наличие актуальной информации является обязательным, а также необходимо, чтобы только один пользователь мог войти в систему.   -  person elibanon    schedule 14.09.2011
comment
Невозможно иметь актуальную информацию, не подвергаясь перфомансу. Именно так работают сеансы HTTP.   -  person Jon    schedule 14.09.2011
comment
Хорошо, можно ли это сделать без выполнения задания cron?   -  person elibanon    schedule 14.09.2011
comment
Добавлен ответ - короче говоря, на практике это зависит, и даже тогда задание cron может быть предпочтительнее.   -  person Jon    schedule 14.09.2011


Ответы (1)


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

На данный момент у вас есть два варианта:

<сильный>1. Запустите задание cron (детерминированное)

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

<сильный>2. Установите вероятность GC сеанса

Установка параметров session.gc_probability и session.gc_divisor PHP позволяет указать вероятность, с которой очистка сеанса будет инициироваться при каждом запросе. Обычно это относительно низкое значение (например, 1/100), потому что при очень высокой нагрузке на сервер это может очень быстро снизить производительность.

Преимущество этого подхода заключается в том, что он встроен и ничего не стоит вам, если ваш сервер на самом деле не подвергается атакам пользователей.

Главный недостаток заключается в том, что вероятность всегда приходится настраивать с учетом количества запросов в секунду на вашем сервере, которое не является константой. Другими недостатками являются тот факт, что он полагается на запросы для фактической работы (никогда не будет очищать сеансы, если никто не посещает ваш сервер) и что это глобальная настройка (работает на уровне сервера, а не на уровне приложения).

person Jon    schedule 14.09.2011
comment
Прежде всего, спасибо за ваш ответ, что касается сеанса GC, могу ли я справиться с уничтожением сеанса, например, чтобы обновить таблицу БД? - person elibanon; 14.09.2011
comment
@elibanon: Да, session_set_save_handler позволяет вам сделать это. Но не лезьте туда сразу, это на 100% уверено, что ZF это уже делает. Не уверен, как вы можете подключиться к обработчику сеанса ZF, не использовал его. - person Jon; 14.09.2011
comment
Я использовал этот интерфейс Zend_Session_SaveHandler_Interface и отлично работал. - person elibanon; 16.09.2011