Как увидеть, находится ли пользователь в сети на веб-сайте с базами данных 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
- когда пользователь использует это обновление сайта последнее действие в каждом" x " мин с ajax
- когда пользователь нажимает на выход, установите статус off line. Это может быть база данных структура.
вы можете достичь этого, зарегистрировав последнее действие пользователя (на каждой странице загрузка, обновление, действие выполняется) в базе данных, а затем проверьте сессии.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;
}
?>
вы можете улучшить его, но вы меня поняли надеюсь.