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

#php #mysql #database #login-control

#php #mysql #База данных #вход-контроль

Вопрос:

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

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

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

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

Ответ №1:

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

Ответ №2:

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

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

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

Комментарии:

1. Итак, теперь я ничего не могу сделать. Я просто могу сидеть и смотреть, как мои пользователи злятся 🙂 Это плохо. Как я могу реализовать это с помощью ajax? Разве этот метод все еще не зависит от того, взаимодействует ли пользователь с сайтом. Разве это не javascript-сторона кодирования? Если это так, пользователь должен получить доступ к моему сайту, чтобы взаимодействовать с ajax 🙂

2. Вы реализуете функцию «последний раз видели менее X минут». Это работает. Теперь, чтобы повысить надежность функции, уменьшите X и заставьте пользователей взаимодействовать каждые X / 2- (1 мс), используя, например, AJAX.

3. Ответ, отмеченный как правильный, предлагает практическое решение, противоречащее вашему утверждению

Ответ №3:

 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();
?>
  

Ответ №4:

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

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

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

Ответ №5:

Надуманное решение.

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

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

Ответ №6:

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

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

введите описание изображения здесь

Ответ №7:

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

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

Комментарии:

1. Эй, я чего-то не понимаю. Способны ли базы данных выполнять подсчет или видеть пользовательскую last_activity без взаимодействия с пользователем? Или сказать, если пользователь ничего не делает с базой данных. Считает ли база данных время самостоятельно, и если она видит, что пользователь не был активен в течение половины нашего времени, чтобы обновить таблицу и установить статус в автономном режиме? Может ли это произойти без взаимодействия с пользователем. Если это так, я могу использовать базы данных для просмотра last_activity и обновления таблицы без взаимодействия с пользователем

2. Нет, сама база данных не может обнаружить активность пользователя. Вы должны обновлять поле в таблице users при каждом запросе на страницу вашего сайта. Было бы проще, если бы у вас был внешний контроллер. А вы?

3. У меня общий хостинг. Я не могу ни установить контроллер, который будет выполнять работу в фоновом режиме. Как они это делают? как форумы доски объявлений делают это? Как это делают другие сайты? Для этого должна быть какая-то вещь. Что, если пользователь просто выключит компьютер. Что тогда? как я могу обновить таблицу. 🙁

4. «Front controller» означает, что пользователь получает доступ только к одной странице вашего сайта, и что PHP-скрипт позаботится о возврате соответствующего ответа. Например, /index.php?page=foo вместо /foo.php . Таким образом, вы можете поместить код для обновления активности пользователя только в index.php файл, а не в foo.php файл.

5. Нет, я этого не делаю. Я использую классы и больше ajax для выполнения большинства задач. Но, пожалуйста, прочтите это -> Что, если пользователь просто выключит компьютер? Нет взаимодействия, ничего, просто ничего. Как я буду обновлять свою таблицу?

Ответ №8:

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

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

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

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

Ответ №9:

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

 var body = document.getElementById('body');
var url = './member-activity.php?loggedUser=<?=$memb_id?>amp;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>
  

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

Ответ №10:

Ну, реальный ответ на ваш вопрос «Как я буду обновлять таблицу без взаимодействия с пользователем?»

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

Ответ №11:

на самом деле единственный точный способ сделать это — использовать websocket, он будет взаимодействовать с пользователем в режиме реального времени, попробуйте Ratchet.

Ответ №12:

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

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

  <?php

  $stauts_from_table_column;

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

?>
  

Вы можете улучшить это дальше, но я надеюсь, вы поняли мою точку зрения.

Комментарии:

1. Люди, пожалуйста, прочитайте мой вопрос. Как я буду обновлять таблицу без взаимодействия с пользователем. Что, если пользователь просто выключит компьютер??? Нет взаимодействия для обновления таблицы, ничего, ничего. Что теперь?

2. @aygeta Для автоматического обновления базы данных вы можете запустить CRON job на сервере, который будет выполняться каждую минуту и в зависимости от времени последней активности пользователя обновит поле столбца. Другой способ без задания cron заключается в том, что в следующий раз, когда пользователь пытается войти в систему, вы проверяете, не установлен ли сеанс, и он установлен в базе данных. После аутентификации обновите его соответствующим образом.