2012-06-21 5 views
3

Я создал простое приложение чата в PHP/Ajax/MySQL.Обнаружение, если пользователь вышел из чата

Я регулярно называя эти двух methods-

setInterval("GetChatParticipants()",5000); 
setInterval("GetChatMessages()",1000); 

Теперь согласно проекту клиента, нет Выхода или зарегистрироваться кнопкой Out, поэтому я хочу, чтобы определить, когда пользователь закрывает браузер и в то время я должен удалите запись участника из базы данных. Я не хочу использовать onbeforeunload, так как Chrome отказывается принимать запросы Ajax на событие выгрузки окна.

Так что я думаю об осуществлении в Ajax, повторяя повторные требования. Но вопрос в том, как именно я должен это делать. Должен ли я обновить таблицу Участника last_active_time, и если разница между текущим временем и тем, что last_active_time, скажем, более 10 минут, то я должен удалить пользователя? Это практическое решение или может быть лучше?

ответ

1

У вас есть лучшее решение IMO. В Javascript создайте функцию «ping», которая пинает каждую минуту/две минуты и т. Д. С идентификатором сеанса, уникальным для этого браузера/сеанса. У вас есть таблица сеансов на вашем сервере и обновляется, когда вы получаете пинг. У вас есть другой скрипт, который ищет записи, которые не пинговались в течение длительных периодов времени и закрывают сеансы.

У меня была эта структура, работающая на тысячи одновременных пользователей на одном сайте, и мне пришлось отбрасывать пинг с 1 минуты до 2 минут, когда загрузка была тяжелой (это было на двух балансированных нагрузках серверах при запуске остальная часть сайта тоже). Очевидно, что вы делаете свой пинг примерно на 45% времени тайм-аута (поэтому, если один из них не срабатывает, второй должен ударить). Это простой процесс, который может обрабатывать нагрузку.


Edit: не используйте «setInterval» для пинг, но пользователь «SetTimeout», когда каждый пинг либо возвращается или выходит из строя. В противном случае, если setInterval, если ваш сервер слишком загружен, тогда очередь pings, никогда не отвечает и не ставит очередь в очередь. Вы получаете расплавление сервера, поскольку все сокеты сервера используются, тогда вы не можете подключиться ssh, чтобы исправить это ... ни на минуту я не гордился.

+0

Кроме того, у меня все равно будет функция выхода/выхода на сервер, которая запускается с помощью javascript при закрытии браузера/текущая страница остается ... Для чего-то есть события. Но если они хотят сделать это, как Stackoverflow, где люди остаются в канале некоторое время после закрытия, так что случайные закрытия браузера не влияют на сеанс чата, лучше не :) – sinni800

1

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

1

Да, это практическое решение. Единственное различие заключается в том, где хранить информацию об пользовательском ping. Вы можете сделать это в базе данных или в хранилище с ключом, например memcached. Я предпочитаю второй, поскольку я думаю, что он потребляет меньше ресурсов.