Как узнать, когда пользователь закрывает браузер? Чат-приложение


У меня есть простой чат-клиент, который позволяет пользователям входить под именем пользователя и хранить сообщения, которые они пишут в базе данных sql. Каждые 3 секунды база данных просто печатает все строки. Так что это в основном чат-клиент.

Я бы хотел сохранить список тех, кто находится в сети. Как я могу это сделать? Как я могу почувствовать, когда кто-то закрыл браузер?

Прямо сейчас я вытаскиваю имя пользователя как

$name = $_COOKIE["name"];

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

Идеи? Я довольно новичок в php, javascript и html, так что имейте это в виду:)

6 2

6 ответов:

Поместите онлайн-пользователей в таблицу, которая будет иметь поле с именем "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 для отправки окончательного запроса (который происходит быстро и обычно заканчивается до закрытия окна браузера), но также реализую функцию таймаута. Функция тайм-аута будет работать как образом:

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

Теперь сервер должен выполнять процедуру removeInactive() каждые 60 секунд (допустим, 15 секунд медленного соединения, следовательно, 45/60 секунд), которая удаляет всех пользователей, которые не отправили "все еще живы". сигнал за последние 60 секунд.

Эта система работала хорошо для меня до сих пор, вы можете попробовать ее для себя.

Предполагая, что вы используете AJAX для извлечения сообщений чата каждые X секунд, обновите таблицу пользователей в то время с текущей меткой времени для этого пользователя. Тогда любой, у кого есть метка времени, скажем, старше 10 секунд, вы будете знать, что они покинули страницу.

Используйте событие onbeforeunload.

Вы можете присоединить событие onunload в javascript. Взгляните на http://help.dottoro.com/ljflhicd.php для получения полной информации.

Обратитесь к этим ссылкам. Конечно, это свет для тьмы ура.

Link1: http://www.daniweb.com/forums/thread252828.html

Link2: http://phpeasystep.com/phptu/9.html