Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

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

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

Edit:

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

Ответ 7

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

В запросах загрузки страницы могут быть:

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

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

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

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

Ответ 8

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

Конечно, это действительно зависит от того, как часто пользователь будет менять страницы вашего сайта... чтобы получить более точное представление пользователей в Интернете, вы можете реализовать вызов ajax xmlhttprequest на своей странице, работающий с небольшим интервалом ( 30 секунд или около того), который сбрасывает var memcache, и срок действия переменной memcache истекает через меньшее время (1 минута для учета возможных проблем с браузером). Это НЕ ПОЛНОСТЬЮ точно, но поскольку http не имеет постоянного соединения с сервером, вы довольно ограничены тем, что можете сделать.

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

Ответ 9

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

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

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

Ответ 10

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

$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);
    }
}