2008-10-29 5 views
6

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

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



UPDATE @ 16:33:
Что делать, если у вас есть система, в которой пользователи могут взаимодействовать друг с другом (но они могут взаимодействовать только с интернет-пользователей)? Пользователь должен знать, какие другие пользователи сейчас в сети.

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

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



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

ответ

1

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

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

0

Гадкий но может быть работоспособным предложение:

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

2

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

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

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

+0

Вместо cron проведите проверку пользователя на логике страницы (посмотрите файл cookie, отметьте столбец «last_visited» в записи db пользователя и т. Д.). Поэтому, если пользователь решает снова стать активным, вы можете проверить информацию и активность пользователя и все еще иметь возможность перенаправлять, поскольку заголовки еще не отправлены. – 2009-02-26 06:42:16

0

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

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

2

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

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

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

0

Я знаю, что это может быть старше вопрос, но «лучший» ответ на ваш вопрос здесь: 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 
}