Как увидеть, находится ли пользователь в сети на веб-сайте с базами данных php и mysql?

Я создаю веб-сайт сообщества. Пользователи будут входить и выходить из системы, как обычно.

Я использую статус атрибута online / offline для установки статуса пользователя. Но что, если пользователь просто нажимает на кнопку X или отключается, в противном случае без выхода из системы?

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

Я пробовал last_time activitiy, но это не работает в случае сбоя компьютера! И не было ничего ни интерактивности, ни обновления для обновления таблицы.

12 ответов


вам не нужен флаг online/offline, вам просто нужно сохранить последнее время активности. При отображении состояния пользователя, если время последнего действия меньше, чем сейчас+15 минут, пользователь находится в сети, в автономном режиме в противном случае.


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

вы можете иметь скрипт (AJAX) проверять каждые X минут, чтобы увидеть, если браузер все еще отвечает, А если нет, переключаться в автономном режиме - но это потребляет дополнительные ресурсы. Вот как, например, работает IRCd: они пингуют вас, вы возвращаетесь. Если вы не вернетесь, вы потеряете время и отключитесь от сервер.

HTTP не имеет состояния, нет другого встроенного решения. Возможно, HTML5 и сокеты, но это будет тот же принцип, что и просто AJAX.


CREATE TABLE `user_online` (
`session` char(100) NOT NULL default '',
`time` int(11) NOT NULL default '0'
) TYPE=MyISAM;

<?php

session_start();
$session=session_id();
$time=time();
$time_check=$time-600; //SET TIME 10 Minute

$host="localhost"; // Host name
$username=""; // Mysql username
$password=""; // Mysql password
$db_name="test"; // Database name
$tbl_name="user_online"; // Table name

// Connect to server and select databse
mysql_connect("$host", "$username", "$password")or die("cannot connect to server");
mysql_select_db("$db_name")or die("cannot select DB");

$sql="SELECT * FROM $tbl_name WHERE session='$session'";
$result=mysql_query($sql);

$count=mysql_num_rows($result);

if($count=="0"){

$sql1="INSERT INTO $tbl_name(session, time)VALUES('$session', '$time')";
$result1=mysql_query($sql1);
}

else {
"$sql2=UPDATE $tbl_name SET time='$time' WHERE session = '$session'";
$result2=mysql_query($sql2);
}

$sql3="SELECT * FROM $tbl_name";
$result3=mysql_query($sql3);

$count_user_online=mysql_num_rows($result3);

echo "User online : $count_user_online ";

// if over 10 minute, delete session
$sql4="DELETE FROM $tbl_name WHERE time<$time_check";
$result4=mysql_query($sql4);

// Open multiple browser page for result


// Close connection

mysql_close();
?>

вы можете запустить функцию на каждом запросе страницы, которая обновляет строку в вашей базе данных с идентификатором пользователя и рассчитанной меткой времени на будущее (например,time()+(60*5); - пять минут). Затем, когда другой пользователь пытается проверить, находится ли первый пользователь в сети, вы можете проверить его по базе данных, используя проверку "pulse":

$time = time();
$query = mysql_query("SELECT user_id, timestamp FROM online_users WHERE user_id = '$user_id' AND timestamp > '$time'");

Если этот запрос возвращает более 0 строк, пользователь считается подключенным.


решение надуманными.

использовать узел.сервер js с сокетом.Ио. Попросите клиента подключиться к серверу через сокет.io клиентская сторона. Сервер отвечает за передачу событий клиентам и ожидание ответа. При отключении или позднем ответе отметьте пользователя в автономном режиме.

Он будет работать и, вероятно, будет работать даже при отключении кабеля/закрытии браузера, но стоит ли прилагать усилия?


вы на правильном пути: сохраните время UNIX последнего действия пользователя в базе данных и, когда кто-то обращается к сайту, установите offline статус для пользователей, которые не были активны течение 15 минут (или меньше). Если пользователь вошел в систему и его статус установлен до offline в базе данных заставьте его выйти из системы (уничтожив сеанс).

однако, реальный вопрос: стоит ли это того? Я еще не видел подобной системы аутентификации.


Я бы использовал комбинацию сеансов тайм-аута, у которых не было недавней активности, и истекающих старых сеансов при успешной попытке входа в систему.

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

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

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


подождите, я думаю, что у меня есть правильный ответ, потому что я столкнулся с той же проблемой ! попробуйте использовать событие мыши [click, movemouse ..] но с задержкой, чтобы не создать сбой в навигаторе, вы будете использовать setInterval на xx сек или минут после сохранения ответа на событие в вашей БД в столбце activity, но с unix-временем, чтобы дифференцировать его позже в настоящее время .. его полезно действительно, я использовал его для регистрации членов acitvity, чтобы узнать, что они действительно делают в режиме реального времени и получить онлайн / оффлайн пользователи тоже. вот используемые функции js:

var body = document.getElementById('body');
var url = './member-activity.php?loggedUser=<?=$memb_id?>&curl=<?=($_SERVER['QUERY_STRING'])?>';
if(document.addEventListener) {
  document.addEventListener("click", _EventLogging, false);
    document.addEventListener("mousemove", _EventLogging, false);
}else{
  document.attachEvent("onclick", _EventLogging);
}
function _EventLogging(){
//call it after a delay of 
setTimeout(AjaxUrl(url), 2000); //delay of 2 sec after every move of cursor
}
//AjaxUrl is a js function that calls a php file to perform the activity logging via AJAX
</script>
<div id="id"></div>

div выше, чтобы уведомить вас об ошибках в коде, U удалите его, когда его ОК! я надеюсь, что мой ответ был правильным для случая ur //dr.alpha@hotmail.co.uk


Ну реальный ответ на вопрос ur "как я буду обновлять таблицу без взаимодействия с пользователем ?"

Это MySQL Event scheduler, вы планируете событие (запрос), которое будет выполняться в любое время, когда вы хотите, даже если пользователь находится в автономном режиме , прочитайте об этом здесь (http://dev.mysql.com/doc/refman/5.1/en/events-overview.html)


вы можете использовать этот метод 1. проверка состояния пользователя если это online проверить последнее действие если это более 10 минут, установите статус в offline если это меньше, чем 10 мин шоу до пользователя онлайн если он выключен, покажите пользователю offline

  1. когда пользователь использует это обновление сайта последнее действие в каждом" x " мин с ajax
  2. когда пользователь нажимает на выход, установите статус off line. Это может быть база данных структура.

enter image description here


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


согласно вашему сценарию, вы можете использовать приведенную ниже логику для проверки состояния пользователя:

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

 <?php

  $stauts_from_table_column;

  if($stauts_from_table_column==1 && isset($_SESSION['userid']))
  {
   $user_logged_in = true;
  }
  else
  {
   $user_logged_in = false;
  }     

?>

вы можете улучшить его, но вы меня поняли надеюсь.