Cuthbert_Allgood
@Cuthbert_Allgood
Программирую на РHP

PHP: Как удалить пользователя из базы после истечения сессии?

Добрый вечер.

Предыстория: делаю простой чат. Для регистрации пользователь указывает только никнейм. Никнейм - не уникален, может быть несколько пользователей с одним никнеймом. При быстрой регистрации пользователь добавляется в базу, при разлогине - пользователь удаляется. Пользователь может создавать комнату или заходить в комнаты. Если пользователь уходит из комнаты последним - она удаляется.

Проблема: если пользователь зашёл в комнату, отошёл от компьютера и у него закончилась сессия. В итоге остаётся мёртвая комната с мёртвым пользователем в базе.

Вопрос: как решить такую проблему? Может быть есть какие-то стандартные функции? Или можно посмотреть по какому-нибудь примеру? Необходимо как-нибудь проверить, если кончилась сессия у пользователя, то удалять его из базы.

Использую фреймворк YII2.
  • Вопрос задан
  • 605 просмотров
Пригласить эксперта
Ответы на вопрос 4
@dinegnet
1. Считать что протухшая сессия = отсутствующей записи.
2. По крону вычищать всех протухших. Как часто - решите сами на основании данных о степени загруженности вашей системы.
Ответ написан
ThunderCat
@ThunderCat
{PHP, MySql, HTML, JS, CSS} developer
При быстрой регистрации пользователь добавляется в базу, при разлогине - пользователь удаляется.
Вам не кажется что тут есть некое лишнее телодвижение? Не проще хранить всю ту лабуду что вы при регистрации пишете в базу в сессии?
Как вариант - храните в редис, там есть время жизни записи, все что мертвое - отвалится само собой по таймауту.
Ответ написан
Комментировать
Вам нужно событие удаления пользователя по таймауту. Чтобы по нему проверять комнаты пользователя на предмет того, не удалить ли и их заодно.

Т.е. чтобы наступление определённого времени вызывало выполнение процедуры.

Такого механизма в PHP нет. Поэтому остаётся раз в N минут смотреть на часы и решать, что же сделать.

upd. Можно вместо БД использовать Redis – там есть механизм Expire (удаления устаревших ключей). При каждом событии пользователя отодвигается время отмирания его сессии. С комнатами пользователя, наверное, надо поступать так же: при каждом событии пользователя заодно обновлять и все его комнаты.

Придётся проверять каждые, скажем, 5 минут все сессии: какие из сессий пора удалить + проверить их комнаты.
Ответ написан
Комментировать
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
таблица Activity, которая хранит последнее действие пользователя.
Если следующее действие было с интервалом, превышающим время сессии - удаляем комнату.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы