Лучшая практика PHP отслеживает зарегистрированных пользователей

Я хочу показать пользователям, которые еще вошли в систему комментариев. Каковы наилучшие методы отслеживания пользователей? Например:

Вы отслеживаете все сеансы, а затем отмечаете их как закрытые. Или вы удаляете пользователей при выходе из системы, отслеживая только активных пользователей.

Я думаю, что я должен создать таблицу с идентификатором пользователя, время входа в систему, время выхода из системы и/или статус. Это путь или есть альтернативный подход к идентификаторам сеанса отслеживания. Если используется таблица, существует ли значение для ведения sessionid. Должен ли я удалять строку, когда сеанс больше не активен, что отрицает необходимость в поле loglogout.

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

Лучше ли использовать учетные записи пользователей до тех пор, пока они не уничтожили сеанс... например, FB и Gmail оставят вас в журнале почти неограниченно - или будет ли время с момента последнего действия? Идея сохранения этой таблицы каждый раз, когда есть активность на сайте, не привлекательна.

Сейчас я думаю о следующем:

create table loggedin (userid (int), whenloggedin (datetime), whenlogged out (datetime), loggedin(tinyint))

при этом последний переходит в 0 либо в случае, если он не имеет значения null или после некоторого длительного срока, как 24 часа. Я предполагаю, что FB, оставив вас в течение длительного времени, также отслеживает активность в чате и т.д., Но не уверен. Я также думаю о том, чтобы позволить таблице расширяться, а не удалять закрытые сессии, но, возможно, это ошибка.

Будет ли этот подход считать адекватным или есть лучший способ. Многие из них за советом по этому поводу.

Ответ 1

В зависимости от того, как вы хотите работать, у вас есть в основном два варианта:

  • Определите тайм-аут, после которого вы считаете, что пользователь вышел из системы.
  • Используйте ajax/websockets/независимо от того, как опросить пользователя.

1: Тайм-аут

Это более простой вариант использования. Каждый раз, когда пользователь запрашивает страницу, вы обновляете временную метку в своей базе данных.

Чтобы узнать, сколько пользователей подключено к сети, вы будете делать запрос к этой базе данных и делать COUNT пользователей, которые были активны за последние N минут.

Таким образом вы получите относительно точное представление о том, сколько людей активно использует сайт на данный момент.

2: Постоянный опрос

Это немного сложнее реализовать из-за необходимости обновлять сервер с помощью Ajax. В противном случае он работает так же, как # 1.

Всякий раз, когда пользователь находится на странице, вы можете сохранить открытое websocket или делать ajax-запросы каждые N секунд на сервере.

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

Небольшая модификация идеи заключалась бы в использовании script на клиенте для отслеживания движения мыши. Если пользователь не перемещает мышь на вашу страницу за 10 минут, вы остановите опрос или отключите websocket. Это позволит устранить проблему, показывающую пользователей, которые не работают в режиме онлайн.

Ответ 2

Чтобы обойти проблему, зная, что пользователь вышел из системы или сбой в работе браузера, следует использовать сортировку в режиме "сердцебиение/опрос" здесь, это урезанный пример того, как вы можете сделать это с помощью jQuery

function heartbeat(){
   setTimeout(function(){
      $.ajax({ url: "http://example.com/api/heartbeat", cache: false,
      success: function(data){
        //Next beat
        heartbeat();
      }, dataType: "json"});
  }, 10000);//10secs
}

$(document).ready(function(){
    heartbeat();
});

http://example.com/api/heartbeat будет поддерживать сеанс в активном режиме и обновлять временную метку в вашем db, а затем на каждой загрузке страницы вы должны проверить метку времени с текущим временным временем, а если ниже, то сказать 15 секунд, то вы выходите из системы.

Ответ 3

Постоянный опрос и использование heartbeat - хорошая идея, но для некоторых сценариев они могут создавать бесполезную нагрузку на сервер. Я думаю, вы должны подумать о важности отслеживания ваших пользователей и использовать его очень правильно. Специально во время загрузки.