У меня есть простой чат-клиент, который позволяет пользователям входить в систему с именем пользователя и хранить сообщения, которые они пишут в базе данных sql. Каждые 3 секунды база данных просто печатает все строки. Так что это в основном клиент чата.
Я хотел бы сохранить список тех, кто в сети. Как я могу это сделать? Как я могу понять, когда кто-то закрыл браузер?
Прямо сейчас я вытаскиваю имя пользователя как
$name = $_COOKIE["name"];
и если это значение пустое, я знаю, что они ушли. Но как только они ушли, слишком поздно знать, что их имя пользователя, поэтому я не могу отслеживать, кто именно ушел.
Идеи? Я довольно новичок в php, javascript и html, так что имейте это в виду 🙂
поместите онлайн-пользователей в таблицу, которая будет иметь поле с именем «lastSeen», обновляющее это поле каждые несколько секунд с помощью вызова ajax.
ajax-вызов будет сделан следующим образом:
window.setInterval(function() { $.ajax({ url: _URL_ENGINE + "/updateLastSeen/?userid=" + userID, success: function(data) { } }); }, 2000); // 2000 means 2 seconds
теперь, чтобы запросить список онлайн-игроков, вы можете запросить их, как
select * from players WHERE lastSeen > DATE_SUB(NOW(), interval 40 SECOND)
надеюсь это поможет
Трудно отправить последний запрос на сервер, когда кто-то закрывает окно, так как браузеры обычно не ждут завершения выполнения JS, когда пользователь хочет закрыть окно (как в случае с onbeforeunload
).
Всякий раз, когда мне приходится сталкиваться с подобной ситуацией, я onbeforeunload
использовать onbeforeunload
для отправки окончательного запроса (что происходит быстро и обычно заканчивается до закрытия окна браузера), но также реализует функцию тайм-аута. Функция таймаута будет работать следующим образом:
Каждый раз, когда пользователь отправляет что-то на сервер, сервер распознает это как «все еще там». В то же время клиент устанавливает таймер, скажем, 45 секунд. Если пользователь не вводит ничего за 45 секунд, клиент отправляет сигнал «все еще живой», чтобы оставаться на связи.
Теперь сервер должен выполнять процедуру removeInactive()
каждые 60 секунд (разрешить 15-секундный запас медленного соединения, следовательно, 45/60 секунд), который удаляет всех пользователей, которые еще не отправили сигнал «все еще живой» за последние 60 секунд ,
Эта система отлично работала для меня до сих пор, вы можете попробовать ее сами.
Предполагая, что вы используете AJAX, чтобы забирать сообщения чата каждые X секунд, обновите таблицу пользователей в то время с текущей временной меткой для этого пользователя. Тогда любой, у кого есть отметка времени, говорит, что старше 10 секунд, вы узнаете, что они покинули страницу.
Используйте событие onbeforeunload
.
Вы могли бы подключиться к событию onunload в javascript. Взгляните на http://help.dottoro.com/ljflhicd.php для получения полной информации.
См. Эти ссылки. Конечно, это свет для тьмы тьмы.