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

StackOverflow https://stackoverflow.com/questions/1051895

  •  20-08-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

Всякий раз, когда пользователь обращается к странице, обновите поле в своей записи таблицы пользователей в последний раз. Затем сделайте запрос для всех пользователей, имеющих последний раз в течение последних 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 DB, когда пользователь входит в мой сайт,

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

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

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

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

Есть хорошая нить о часовых поясах здесь.

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

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

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

Еще лучше, храните все время как время сервера, и основывайте все вычисления относительно только для сервера.

Зависит от вашей ситуации, вам может быть лучше создать отдельную таблицу «чья онлайн» с столбцами: «IP» и «последнее время» и запрос/обновлять эту таблицу каждый раз, когда пользователь загружает страницу.

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

  1. Обновление/вставка «Таблица чьего-то на онлайн» для текущего пользователя на основе IP.
  2. Удалить строки «истек» (также могут быть периодически выполняться с использованием Cronjob).
  3. Считайте «активные» пользователи.

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

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

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

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

Конечно, это действительно зависит от того, как часто пользователь будет менять страницы на вашем сайте ... Чтобы получить более точное представление пользователей в Интернете, вы можете реализовать вызов Ajax xmlhttprequest на вашей странице, работающем с небольшим интервалом (30 секунд или Таким образом), что сбрасывает Memcache VAR, и заставили Memcache VAR истекать за меньшее время (1 минута, чтобы учесть возможные проблемы браузера). Это не совсем точно, но, поскольку HTTP не имеет постоянного соединения с сервером, вы довольно ограничены в том, что можете сделать.

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

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

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

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

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

$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);
    }
} 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top