Я пытаюсь внести некоторые изменения в проект с открытым исходным кодом. Я хочу отслеживать, когда пользователи входят в систему и выходят из системы. Сейчас я меняю свой статус входа в db, когда они входят в систему или вручную выходят из системы. Проблема прямо сейчас заключается в том, что я не могу узнать, просто ли пользователь закрыл свой браузер, не нажимая кнопку выхода. По этой причине мне нужно вызвать функцию, которая будет изменять базу данных каждый раз, когда истекает срок действия сеанса пользователя. Я пробовал session_set_save_handler
в PHP, но похоже, что мне нужно переопределить поведение всего сеанса. Я ищу, чтобы поддерживать поведение сеанса по умолчанию и просто добавлять функциональные возможности, когда истекает срок действия сеанса пользователя. Есть ли способ сделать это?
Однажды я сделал что-то действительно противное. Каждый раз, когда сеанс «обновлялся» обновлением / выборкой страницы и т. Д., Я обновлял метку времени в строке базы данных. Второй демон опросил БД каждые 10 минут и выполнил «очистку» операций.
Вы не найдете каких-либо собственных возможностей PHP для достижения своей цели. Тайм-аут сеанса не работает в фоновом режиме. Вы даже не узнаете, завершился ли сеанс, если сеанс тайм-аута не пытается получить другой доступ. На данный момент, почти невозможно ловушку, вы можете сделать свое определение и обработать его соответствующим образом.
Я бы рекомендовал архитектуру очереди и опроса для этой проблемы. Это легко и определенно будет работать. Добавьте memcached, если у вас есть проблемы с производительностью транзакций.
Я предполагаю, что вы используете стандартные PHP-сессии, основанные на файлах. Если это так, то PHP сделает свою собственную сборку мусора устаревших сессий на основе параметров конфигурации session.gc_ * в php.ini. Вы можете переопределить их, чтобы полностью отключить сборщик мусора, а затем свернуть собственный скрипт GC.
Вы можете либо проверить метки времени на файлах (быстро и легко сделать в цикле с stat ()), чтобы найти «старые» сеансы, или проанализировать данные в каждом файле, чтобы проверить переменную, в которой указано время последнего доступа. В любом случае, файлы сеанса – это всего лишь результат serialize($_SESSION)
и могут быть трижды перезагружены в другой экземпляр PHP.
Как насчет события закрытия окна на javascript. Таким образом, в основном сеанс уничтожается, когда все окна сайта сеанса закрыты. Итак, когда последнее окно закрыто (это проверяется с помощью дополнительной проверки js), отправьте запрос ajax на сервер.