PHP: при смерти сеанса смена БД - PullRequest
1 голос
/ 15 октября 2010

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

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

Есть ли лучший способ для меня реализовать то, чего я пытаюсь достичь?

Спасибо

Редактировать: Для тех, кто находится в той же ситуации, что и я, я сделал то, что предложил Никич. У меня есть журнал, который отслеживает каждую страницу, посещенную каждым пользователем. Чтобы проверить, подключен ли пользователь к сети, я проверяю свою БД, чтобы проверить, установлена ​​ли переменная, вошедшая в систему, и затем дважды проверяю, были ли какие-либо действия в недавнем прошлом, чтобы узнать, действительно ли пользователь находится в сети.

Ответы [ 3 ]

1 голос
/ 15 октября 2010

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

0 голосов
/ 15 октября 2010

Сессионный сборщик мусора в PHP не предоставляет никакого механизма обратного вызова, который мог бы запустить скрипт для обновления переменной «пользователь онлайн».Это было бы очень неплохо, но сейчас это не PHPчем ваш период ожидания и обновить базу данных на основе этого.Msgstr "Если файл сеанса старше 30 минут, настройте пользователя на выход из системы в базе данных".Для этого вы можете либо сохранить идентификатор базы данных пользователя в файле сеанса и извлечь его (файлы сеанса - это просто serialize() 'd содержимое $_SESSION[]), либо извлечь идентификатор сеанса из имени файла ('sess_' . session_id()по умолчанию) и использовать его для обновления базы данных.

Не вижу, как это будет больше, чем 20 или 30 строк кода, если у вас нет огромной библиотеки интерфейсов БД для обработки.С SPL DirectoryIterator тривиально сканировать файлы на их «mtime».

0 голосов
/ 15 октября 2010

На самом деле сеансы с истечением времени = 0 будут умирать каждый раз, когда пользователь делает запрос. У сервера нет возможности узнать, открыт браузер или нет, и поэтому сессия истекает через X минут (и почему у нас вся концепция сессии в первую очередь).

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