Паттерн php-наблюдателя для выхода из системы по истечении времени сеанса - PullRequest
6 голосов
/ 29 октября 2008

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

встроены ли эти вещи в любые доступные сессионные пакеты pear или zend? Я буду использовать все, что мне нужно, чтобы это произошло!



ОБНОВЛЕНИЕ @ 16: 33:
Что если у вас есть система, где пользователи могут взаимодействовать друг с другом (но они могут взаимодействовать только с онлайн-пользователями)? Пользователь должен знать, какие другие пользователи онлайн в настоящее время.

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

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



ОБНОВЛЕНИЕ @ 16: 56:
право. Благодарю. Я согласен ... вроде некрасиво. У меня уже есть некоторые медленные опросы сервера, поэтому было бы довольно легко реализовать этот метод. Это просто кажется такой полезной функцией для пакета обработки сеанса. Zend и PEAR имеют сессионные пакеты.

Ответы [ 6 ]

2 голосов
/ 29 октября 2008

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

SELECT *  FROM Users WHERE LoggedIn=1 AND LastAccess > DATEADD(Minute,-20.GETDATE())

Что бы вернуть пользователей, у которых еще есть активный сеанс. Извините за SQL, который, вероятно, не работает с MySQL / PHP, но это должно дать вам общее представление.

2 голосов
/ 29 октября 2008

Сначала возьмите простейший случай. Предположим, у вас есть 1 пользователь в вашей системе, и вы хотите, чтобы время его сеанса истекло, и вы хотите получать точные отчеты об их состоянии. Пользователь не был на странице в течение 12 минут, а время сеанса установлено на 10 минут. Произойдет одно из двух. Либо они посетят снова в ближайшее время, либо они не будут. Если они не посещают снова, как система будет запускать код для обновления своего состояния тайм-аута? Единственный способ * состоит в том, чтобы отдельный процесс инициировал функцию обновления статуса для всех пользователей, которые в данный момент находятся в состоянии «в сеансе».

Каждый раз, когда пользователь посещает ваш сайт, обновляйте переменную в базе данных, которая связывает его сеанс с последним временем доступа. Затем создайте работу cron, которая выполняется каждую минуту. Вызывает простую функцию для проверки состояния сеанса. Любые сеансы старше периода ожидания устанавливаются в состояние «тайм-аут». (Вы также должны очистить стол после того, как тайм-аут сеансов некоторое время просидел). Если вам когда-нибудь понадобится отчет о количестве людей, вошедших в систему, запросите все записи, время последнего доступа к которым было позднее времени начала отсчета.

"*" Существуют и другие способы, но для простых веб-приложений это на самом деле не нужно. Если у вас есть что-то более сложное, чем простое веб-приложение, обновите свой вопрос, чтобы отразить конкретные потребности.

1 голос
/ 29 октября 2008

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

Но для практических целей это обычно не имеет значения.

0 голосов
/ 12 октября 2011

Я знаю, что это может быть более старый вопрос, но «лучший» ответ на ваш вопрос находится здесь: http://www.codeguru.com/forum/archive/index.php/t-372050.html

Вот что он говорит: Файл php.ini содержит параметр sesison.save_path, который определяет, куда PHP помещает файлы, содержащие данные сеанса. Как только сессия устарела, она будет удалена PHP во время следующей сборки мусора. Следовательно, тест на наличие поля для этого сеанса должен быть достаточным, чтобы определить, является ли сеанс все еще действительным.

$session_id = 'session_id';
$save_path = ini_get('session.save_path');

if (! $save_path) {
$save_path = '.'; // if this vlaue is blank, it defaults to the current directory
}

if (file_exists($save_path . '/sess_' $session_id)) {
unlink($session_id); // or whatever your file is called
}
0 голосов
/ 29 октября 2008

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

Некоторые примеры создания собственного обработчика сеанса см. http://www.daniweb.com/code/snippet43.html и прочитайте документ PHP http://ca.php.net/manual/en/function.session-set-save-handler.php

.
0 голосов
/ 29 октября 2008

Гадкий, но, возможно, выполнимый совет:

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

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