Событие истечения срока действия PHP-сессии - PullRequest
3 голосов
/ 13 февраля 2010

Я пытаюсь внести некоторые изменения в проект с открытым исходным кодом. Я хочу отслеживать, когда пользователи входят и выходят из системы. Прямо сейчас я меняю их статус входа в БД, когда они входят или вручную выходят из системы. Проблема сейчас в том, что я не могу узнать, закрыл ли пользователь свой браузер, не нажимая кнопку выхода из системы. По этой причине мне нужно вызвать функцию, которая будет изменять базу данных каждый раз, когда истекает сеанс пользователя. Я пробовал session_set_save_handler в PHP, но похоже, что мне нужно переопределить поведение всей сессии. То, что я ищу, это сохранить поведение сеанса по умолчанию и просто добавить функциональность, когда сеанс пользователя истекает. Есть ли способ сделать это?

Ответы [ 3 ]

4 голосов
/ 13 февраля 2010

Я сделал что-то действительно один раз противный. Каждый раз, когда сеанс «обновлялся» обновлением / извлечением страницы и т. Д., Я обновлял метку времени в строке БД. Второй демон опрашивал базу данных каждые 10 минут и выполнял операции «очистки».

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

Я бы порекомендовал архитектуру очереди и опроса для этой проблемы. Это легко и обязательно сработает. Добавьте memcached, если у вас есть сомнения по поводу производительности транзакций.

0 голосов
/ 11 июня 2012

Как насчет события закрытия окна в javascript. Таким образом, в основном сеанс уничтожается, когда все окна сайта сеанса закрыты. Поэтому, когда последнее окно закрыто (это проверяется с помощью дополнительной проверки js), отправьте ajax-запрос на сервер.

0 голосов
/ 13 февраля 2010

Полагаю, вы используете стандартные сеансы PHP на основе файлов. Если это так, то PHP выполнит свою собственную сборку мусора устаревших сессий на основе параметров конфигурации session.gc_ * в php.ini. Вы можете переопределить их, чтобы полностью отключить сборщик мусора, а затем запустить собственный сценарий GC.

Вы можете либо проверить временные метки в файлах (это легко и быстро сделать в цикле с помощью stat ()), чтобы найти «старые» сеансы, либо проанализировать данные в каждом файле, чтобы проверить переменную, в которой перечислены последние время доступа. В любом случае, файлы сеанса являются просто выводом serialize($_SESSION) и могут тривиально перезагружаться в другой экземпляр PHP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...