Какой самый простой способ определить, находится ли пользователь в сети? (PHP/MySQL)

Есть ли способ, которым я могу прокрутить сессии, чтобы знать, если пользователь онлайн?

Т.е.: используйте вход в систему, я установил переменную $_SESSION, время ожидания пользователя для сбора мусора Сборщик мусора обновляет базу данных, чтобы обновить их статус как автономный.

EDIT: Я хочу решение, которое не требует времени или даты. Я хочу что-то кататься на сессиях или что-то подобное. Угадай, если кто-то в сети недостаточно хорош для того, что мне нужно.

10 ответов

Решение

Не пытайтесь выяснить разницу между часовыми поясами. Это не обязательно.

Всякий раз, когда пользователь обращается к странице, обновляйте поле в своей записи таблицы Users в последний раз. Затем выполните запрос для всех пользователей, имеющих последнее время обновления в течение последних 5 минут. Что-нибудь большее, чем это, и они считаются "автономными".

Если вы используете серверное время с помощью функции NOW() в MySQL, вы не станете вычислять разницу между часовыми поясами.

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

Постоянно обновляется

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

var stillAlive = setInterval(function () {
    /* XHR back to server
       Example uses jQuery */
    $.get("stillAlive.php");
}, 60000);

То, что вы просите (после разъяснения), по определению невозможно. HTTP - это протокол без установления соединения, поэтому, как только пользователь заходит на страницу и весь контент возвращается с сервера в браузер пользователя, между ними нет никакой связи. Кто-то "в сети" с вашего сайта менее чем за секунду.

Одна вещь, которую вы могли бы сделать, - это чтобы JavaScript на вашей веб-странице регулярно отправлял запросы AJAX на ваш сервер, включая идентификационную информацию, и другой запрос AJAX, когда пользователь покидает страницу, используя window.onbeforeunload.

Мой путь может быть не самым лучшим, но поскольку мой сайт и база пользователей находятся в базе данных mysql, когда пользователь входит на мой сайт,

  1. Я обновляю таблицу пользователей, чтобы сказать, что они онлайн
  2. Вставьте их в онлайн-таблицу
  3. Затем я установил сеанс с текущим временем

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

Затем у меня есть задание cron, которое выполняется каждые 10 - 15 минут, которое удаляет любые использования из онлайн-таблицы и помечает там пользовательскую таблицу как автономную, если время в сети обновилось в течение X минут.

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

Здесь хорошая ветка о часовых поясах.

Одна вещь, которую я бы посоветовал, - хранить такую ​​информацию в памяти, например, с помощью memcached или mysql heap или redis. Потому что иначе база данных сильно пострадает.

Сохраните часовой пояс в таблице и используйте его в расчете, чтобы найти местное время пользователей по сравнению с местным временем пользователя, просматривающего страницу.

Редактировать:

А еще лучше: хранить все время как время сервера и основывать все вычисления только на времени сервера.

Вот способ узнать разницу между двумя датами из базы данных в минутах, затем проверить разницу и установить статус онлайн / офлайн.

$query = 'SELECT * FROM Users';
$result = mysqli_query($mysqli, $query);

foreach($result as $user){
    // date from the database
    $dbLastActivity = date("d-m-Y h:i:s a", strtotime($user['lastOnline']));
    // date now
    $now = date("d-m-Y h:i:s a", $date);

    // calculate the difference
    $difference = strtotime($now) - strtotime($dbLastActivity);
    $difference_in_minutes = $difference / 60;

    // check if difference is greater than five minutes
    if($difference_in_minutes < 5){
        // set online status
        $updateStatus = 'UPDATE Users SET Status="online" WHERE lastOnline="'.$user['lastOnline'].'"';
    } else {
        // set offline status
        $updateStatus = 'UPDATE Users SET Status="offline" WHERE lastOnline="'.$user['lastOnline'].'"';
    }

    // check if mysqli query was successful
    if (!$mysqli->query($updateStatus)){
        printf("Error Message %s\n", $mysqli->error);
    }
} 

Решение, которое я реализовал для этого, состоит в том, чтобы при каждой загрузке страницы аутентифицированным пользователем устанавливать / сбрасывать переменную memcache, например "user_ {userid} isonline" => true, и истекать ее через 5 минут. Затем проверьте, находится ли var в кеше, когда я получаю доступ к информации пользователя. В зависимости от размера вашей пользовательской базы, если вы хотите получить список всех пользователей в сети, вы можете использовать вызов getmulti memcache с массивом ключей "user {userid} _isonline" для всех ваших пользователей.

конечно, это действительно зависит от того, как часто пользователь будет менять страницы на вашем сайте... чтобы получить более точное представление о пользователях в сети, вы можете реализовать вызов ajax xmlhttprequest на своей странице, выполняемый с небольшим интервалом (30 секунд или итак), который сбрасывает var memcache, и срок действия var memcache истекает за меньшее время (1 минута для учета возможных проблем с браузером). Это не совсем точно, но поскольку http не имеет постоянного соединения с сервером, вы довольно ограничены в том, что вы можете сделать.

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

В зависимости от вашей ситуации, вам может быть лучше создать отдельную таблицу "who-online" со столбцами: "ip" и "last-updated-time" и запрашивать / обновлять эту таблицу каждый раз, когда пользователь загружает страницу.

На странице загрузки запросы могут включать в себя:

  1. Обновление / вставка таблицы "who-online" для текущего пользователя на основе ip.
  2. Удалить "просроченные" строки (также можно делать периодически, используя cronjob).
  3. Подсчитайте "активных" пользователей.

Преимущества использования этой техники:

  1. Если пользователь не вошел в систему, он / она все еще подсчитывается / отслеживается.
  2. Зависит от количества пользователей, которые вы запрашиваете, эта таблица может быть быстрее.

Примечание: если вы используете это, вы должны принять во внимание, что любой просмотр страницы создаст строку в вашей таблице, поэтому на основе useragent вы можете игнорировать ботов или считать только популярные (Firefox, IE, Safari, Opera и т. Д.).

Вы также можете использовать onunload тег... На теле Подробнее здесь ( https://www.w3schools.com/jsref/event_onunload.asp)

Таким образом, вам не нужно ждать 4 -5 минут, пока пользователь не отключится.

Но вы все равно должны использовать метод обновления ajax, если пользовательский браузер зависает...

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