"Сердцебиение" от клиента к серверу в PHP/JS
Я пытаюсь создать небольшое веб-приложение, которое позволяет пользователю "войти" и "выйти". В настоящее время у меня проблема с тем, чтобы позволить клиенту отправлять на сервер постоянные "сердцебиения" или сообщения для уведомления о том, что он все еще активен.
Это более логичный вопрос. Я хочу сделать в php цикл while(1), который проверяет, пропущено ли n тактов. Я все еще хочу, чтобы клиент и сервер могли взаимодействовать во время этого цикла (по сути, я хочу, чтобы сервер вел себя так, как если бы он имел отдельный поток "check_for_heartbeats").
Как это сделать с помощью php? Я сейчас использую XAMPP. Любая помощь приветствуется.
Изменить: чтобы уточнить, что я хочу сделать, это иметь возможность перехватывать событие закрытия браузера даже в тех случаях, когда событие window.unload не срабатывает (например, клиент отключается от Интернета). В этом случае наличие потока для мониторинга сердцебиения кажется наиболее интуитивным решением, хотя я не уверен, как это сделать в php.
Редактирование 2: isLoggedIn() - это просто вспомогательная функция, которая проверяет, установлена ли логическая переменная сеанса ($_SESSION['is_logged_in')).
Edit Final: Хорошо, теперь я точно понимаю, о чем говорили комментарии и ответы. Итак, перефразируя, вот потенциальное решение: имейте код Javascript для отправки "сердцебиений" на сервер. Сервер добавит метку времени, связанную с этими битами. Измените базу данных так, чтобы она содержала эти временные метки. Выполните запрос всей таблицы "временных меток" (более вероятно, таблицы "пользователей" с атрибутом "временной метки") и посмотрите, больше ли разница между NOW и последней временной меткой, чем некоторое пороговое значение. "Выйти" любые пользователи, прошедшие этот порог.
Единственная проблема заключается в том, что в систему вошел только один пользователь, или если все пользователи потеряли соединение одновременно, но в этих случаях больше никто не сможет увидеть, что пользователь потерял соединение.
Это комбинация нескольких ответов, но я думаю, что ответ Криса решает большую часть проблемы. Спасибо и Крису, и Алексу Луниксу за полезный вклад.:D
Вот фрагмент кода для лучшего объяснения
Сторона сервера:
function checkBeats()
{
while(isLoggedIn())
{
// it's been > 30 secs since last heartbeat
if((time() - $_SESSION['heartbeat']) > 30)
{
logout();
break;
}
}
}
2 ответа
Я обычно вызываю php-файл с использованием javascript (jQuery) и обновляю базу данных, или как вам угодно. Этот вопрос может ответить на ваш: как проще всего определить, находится ли пользователь в сети? (PHP / MySQL)
Вы можете использовать ajax для проверки сердечного ритма сценария, который изменяет переменную сеанса heartbeats, и просто в верхней части каждого сценария выполните эту проверку (поместите ее в функцию и вызовите ее, конечно):
// it's been > 30 secs since last heartbeat
if((time() - $_SESSION['heartbeat']) > 30)
{
logout();
}
Изменить: Если вы хотите, чтобы база данных отображала этот статус мгновенно, а не при следующем посещении страницы, вам нужно будет использовать MySQL. Без использования другой программы (например, Java-программы) для проверки базы данных единственное, о чем я могу думать, - это добавить это вверху каждой страницы (в функцию, которая вызывается, конечно):
mysql_query("UPDATE `users` SET `loggedin`=0 WHERE heartbeat<".time()-30);
Что будет обновлять каждого пользователя, а это означает, что точность значения входа в систему будет зависеть от частоты просмотров страниц.