автоматический выход из системы и закрытие браузера - PullRequest
4 голосов
/ 11 июня 2011

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

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

Когда пользователь входит в системув, он просто устанавливает значение для этого пользователя в базе данных SQL равным 1. Когда они вышли из системы, значение должно быть 0.

Я использую $ (window) .unload (function (){});попытаться поймать закрытие вкладки / браузера, но работает только sortof.

Два вопроса:

  1. Есть ли лучший способ поймать закрытие браузера или вкладки?

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

Я использую фронтенд HTML / Jquery с бэкэндом PHP.Что я могу сделать, чтобы выполнить второй вопрос?Я предполагаю, что мне нужно сделать это на PHP ... мы работаем в предположении, что браузер, вероятно, больше не существует, следовательно, не обрабатывает jquery.Может ли PHP сделать что-то с непрерывным таймером, который проверяет, находится ли пользователь по-прежнему ... без простого нажатия пользователем кнопки каждые 10 секунд?

Редактировать: Здесь есть потенциальное решение: Как определить, если пользователь вышел из системы, в php? Но я использую ajax, чтобы избежать обновления страницы.В идеале пользователь будет никогда f5 страницы или нажимать какие-либо кнопки (я тестирую, помните, это не для реального приложения).Будет ли PHP видеть последнее действие без полного обновления страницы?

Edit2: Я добавил следующий код в мой PHP с соответствующей функцией jquery, используя setInterval

if (isset ($_POST['keepalive'])) {
    if (filter_input(INPUT_POST,'keepalive') == '1') {
        $name = $_SESSION['name'];
        $time = time();
        mysql_query("UPDATE tictac_names SET keep_alive = '$time' WHERE name ='$name'") or die(mysql_error());
    }   
}

Это вставляет метку времени unix epoc в мою таблицу, что будет очень просто для простых вычислений.

Теперь у меня вопрос: как мне сказать PHP запускать проверку для каждого вошедшего в систему пользователя, когда X числосекунд?Мой бэкэнд-файл PHP в основном настроен так, чтобы перехватывать пост-переменные и запускать код, а затем возвращать его обратно в jquery.Поскольку этот код предназначен для выхода из неактивных браузеров / пользователей, я не могу полагаться на jquery, отправляющий запрос в PHP, и PHP не обновляется.Нужно ли выполнять какую-то работу cron или что-то странное, чтобы PHP проверял всех пользователей, которые не обновлялись в течение последних X секунд?

Справка!

Ответы [ 6 ]

0 голосов
/ 31 мая 2016

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

Решение

Я также предполагаю, что поддерживается столбец меток времени.Установите интервал для проверки промежутка времени между текущим TS и последней отметкой времени.Также обновите свой собственный TS против своего идентификатора до текущего TS.

setInterval(function(){ 
    $.ajax({
        url: "/backend.php?userid=id",
        success: function(resoponse){
            console.log(response);
        }
    });
}, 10000);

backend.php

$user_id = $_GET["userid"];
$query = "select * from table name where (GETDATE() - timestamp) > 60";
$resut = mysqli_query($con, $query);
while($row = mysqli_fetch_assoc($result)){
    //set there status = 0 as offline
    $other_user_id = $row['user_id'];
    mysqli_query($con, "update tablename set status = 0 where user_id = '$other_user_id'");
}
//update your own timestamp
mysqli_query($con, "update tablename set timestamp = GETDATE() where user_id='$user_id'");

Это будет проверять активность пользователя или, в основном, проверять, запущен этот js или нет.Если браузер был закрыт, TS для этого пользователя не будет обновляться, следовательно, GETDATE () - отметка времени будет больше 60. Теперь другие пользователи, которые будут запускать веб-приложение, также будут запускать тот же сценарий, проверяя и обновляя статус всех пользователей какза условие.Когда пользователь закрывает свою вкладку, он все еще будет в сети не менее 1 минуты.

У меня была похожая проблема, и я нашел решение здесь PHP автоматический выход из системы при закрытии вкладки .

0 голосов
/ 08 мая 2013

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

$_SESSION['ip'] = $_SERVER['HTTP_CLIENT_IP'];
if(isset($_SESSION['ip'])){
    if(Logedin){ // This login detection can be set by cookies can very depending on situation
        mysql_query("INSERT INTO users SET user_login=\"".'1'."\",user_id=\"".$idfromlogin."\",user_ip=\"".$_SESSION['ip']."\",user_time=\"".time();."\"");
    }

Затем мы можем проверять это каждый раз, когда страница загружается против time();, если пользователь закрывает окно кнопкой «X», когда сеанс заканчивается. Теперь нам нужно начать новый сеанс, но именно поэтому мы сэкономили время в базе данных.

$_SESSION['ip'] = $_SERVER['HTTP_CLIENT_IP'];
if(isset($_SESSION['ip'])){
    if (!$sql = mysql_query("SELECT * FROM users WHERE user_ip=".$_SESSION['ip'])){
        die('Error: ' . mysql_error());
    }

    $row = mysql_fetch_array($sql);
    if ($row['user_time'] + 10 * 60 < time()){ // this is 10 minutes have passed
        // now to find the user database by the session database the logins is your method of loging in a user from logins database with pass and name
        if (!$user = mysql_query("UPDATE logins SET user_isloggedin=\"".'0'."\" WHERE user_id=".$row['user_id'])){ //from the users database
            die('Error: ' . mysql_error());
        }
    }

Это только показывает способ проверить IP, если они вернулись, и записанное время прошло предыдущее. Это не показывает, как ловить, когда кто-то нажимает кнопку «X». IP могут меняться, поэтому я бы написал функцию проверки IP:

function getRealIpAddr(){
    if (!empty($_SERVER['HTTP_CLIENT_IP'])){   //check IP from share internet
        $ip=$_SERVER['HTTP_CLIENT_IP'];
    } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){   //to check IP is pass from proxy
        $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
    }else{
        $ip=$_SERVER['REMOTE_ADDR'];
    }
    return $ip;
}
0 голосов
/ 11 июня 2011

Вместо того, чтобы просто устанавливать флаг, когда пользователь входит в систему, зарегистрируйте метку времени, которую вы можете использовать, чтобы определить время входа в систему.Кроме того, вы можете использовать свой клиент call-home с помощью AJAX-сценария PHP для сохранения в базе данных отметки времени последней пользовательской активности.

Затем можно периодически выполнять сценарий очистки сеанса с помощью задания cron всервер.Сценарий будет запрашивать базу данных, чтобы обнаружить устаревшие сеансы и выполнить выход из системы (установите флаг входа в систему на 0).Если на сервере установлен PHP CLI (интерфейс командной строки), вы можете написать скрипт на PHP.

0 голосов
/ 11 июня 2011

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

0 голосов
/ 11 июня 2011

Вы можете реализовать решение на основе $ _SESSION, например, Gumbo ответил на этот вопрос .Затем вы можете адаптировать его для соответствия требованиям вашей базы данных.

0 голосов
/ 11 июня 2011

Не знаю насчет первого вопроса, но как насчет предложения по второму:

Когда пользователь «активен», будут ли они регулярно вызывать запросы страниц? Если это так, вы можете создать систему, в которой зарегистрированный пользователь периодически регистрируется в вашей базе данных SQL с отметкой времени. Затем попросите другой сценарий найти всех тех пользователей, чьи метки времени старше указанного периода (независимо от того, что вы хотите, например, 10 секунд) и установите для них значение «0».

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

РЕДАКТИРОВАТЬ: ОК, на ссылку из вашего редактирования, похоже, ответили с помощью системы, аналогичной той, что я только что предложил. Если вы используете AJAX, вы можете периодически вызывать php-скрипт в фоновом режиме, чтобы устанавливать и проверять временные метки из таблицы SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...