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

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

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

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

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

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

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

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

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

Если вы хотите знать, что они все еще активны, даже если они не перескакивают со страницы на страницу, добавьте немного javascript для ping вашего сервера каждые 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. Вставьте их в таблицу Online
  3. Затем я установил сеанс с текущим временем

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Если вам требуется до второго представления о том, кто в сети, возможно, у вас может быть загружено приложение с флэш-памятью на вашей странице, которое подключается к 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("dmY h:i:sa", strtotime($user['lastOnline'])); // date now $now = date("dmY h:i:sa", $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); } }