«Сердцебиение» от клиента к серверу в PHP / JS - PullRequest
1 голос
/ 12 февраля 2012

Я пытаюсь создать небольшое веб-приложение, которое позволяет пользователю «входить» и «выходить из системы».В настоящее время у меня проблема с тем, чтобы позволить клиенту отправлять на сервер постоянные «сердцебиения» или сообщения для уведомления о том, что он все еще активен.

Это более логичный вопрос.Я хочу сделать в php цикл while (1), который проверяет, пропущено ли n тактов.Я по-прежнему хочу, чтобы клиент и сервер могли взаимодействовать во время этого цикла (по сути, я хочу, чтобы сервер вел себя так, как если бы у него был отдельный поток "check_for_heartbeats".

Как это сделать с помощью php«Я запускаю XAMPP на данный момент. Любая помощь будет высоко ценится.

Редактировать: Чтобы уточнить, что я хочу сделать, это иметь возможность перехватить событие закрытия браузера даже в тех случаях, когда событие window.unloadне срабатывает (например, клиент отключается от интернета). В этом случае наличие потока для отслеживания пульса представляется наиболее интуитивным решением, хотя я не уверен, как это сделать в php.

Редактировать 2: isLoggedIn () - это просто вспомогательная функция, которая проверяет, установлена ​​ли логическая переменная сеанса ($ _SESSION ['is_logged_in')). ​​

Редактировать финал: ХорошоТеперь я точно понимаю, что говорят комментарии и ответы.Итак, перефразируя, вот потенциальное решение: имейте код Javascript для отправки «сердцебиений» на сервер.Сервер добавит метку времени, связанную с этими битами.Измените базу данных так, чтобы она содержала эти временные метки. Выполните запрос всей таблицы «временных меток» (более вероятно, таблицы «пользователей» с атрибутом «временной метки») и посмотрите, больше ли разница между NOW и последней временной меткой, чем некоторое пороговое значение.«Выйдите из системы», если все пользователи превысили этот порог.

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

Это комбинация нескольких ответов, но я думаю, что ответ Криса решает большую часть проблемы.Спасибо Крису и Алексу Луниксу за полезный вклад.: D

Вот фрагмент кода для лучшего объяснения

Сторона сервера:

function checkBeats()
{
    while(isLoggedIn())
    {
        // it's been > 30 secs since last heartbeat
        if((time() - $_SESSION['heartbeat']) > 30)
        {
            logout();
            break;
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 12 февраля 2012

Что я обычно делаю, это вызываю php-файл, используя javascript (jQuery), и обновляю базу данных или что угодно.Этот вопрос может ответить на ваш: Какой самый простой способ определить, находится ли пользователь в сети?(PHP / MYSQL)

1 голос
/ 12 февраля 2012

Вы можете использовать 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);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...