автоматический тайм-аут и закрытие браузера

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

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

Когда пользователь входит в систему, он просто устанавливает для этого пользователя значение в базе данных 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 секунд?

Помогите!

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

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

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

EDIT: ОК, ссылка на ваше редактирование, похоже, получила ответ на подобную систему, что я только что предложил. Если вы используете AJAX, вы можете периодически вызывать php-скрипт в фоновом режиме для установки и проверки временных меток из таблицы SQL.

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

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

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

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

Возможный способ только поймать пользователя, который возвращается на сайт после закрытия окна, может использовать базу данных для идентификатора пользователя, 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();."\""); } . $_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; } 

Я предполагаю, что пользователи отображаются в режиме онлайн и офлайн при выходе из системы. Для уничтожения сеанса или файла 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 минуты.

У меня была аналогичная проблема, и я нашел решение здесь.