"Сердцебиение" от клиента к серверу в 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);

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

Другие вопросы по тегам