Проверить, если пользователь закрыл браузер


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

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

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

Author: Guilherme Nascimento, 2015-06-24

2 answers

В ответ минутах невозможно отправки заявки, так как в момент, когда окно браузера закрывается создает ее разрушается, и не имеет возможности отправить запрос на в время для back-end.

, лучший способ, как указывает в этой вопрос, это создать "таймер" для сеанса пользователя, и это я считаю лучшим способом, с целью, что Google Analytics использует подобный прием.

Будем считать, что вы есть таблица в базе пользователей

id | login | senha | nome | lastactive
-----------------------------------------------
1  | test  | test  | João | 2015-06-24 01:00:23
-----------------------------------------------
2  | maria | maria | Maria| 2015-06-24 01:00:33

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

На каждый запрос пользователя test (при условии, что в настоящее время вошли co), необходимо выполнить update в таблице id ним:

 UPDATE usuarios SET lastactive=CURRENT_TIMESTAMP WHERE id=1

Для отображения этого пользователя с другим пользователем (например, если вы являетесь чат) в PHP должно быть что-то вроде:

define('REQUEST_TIME', $_SERVER['REQUEST_TIME']);
define('TIME_ONLINE', 120);//120 = 2 minutos

function isOnline($timer) {
    return REQUEST_TIME - strtotime($timer) > TIME_ONLINE;
}

$query = 'SELECT nome, lastactive WHERE 1 ORDER by nome';
if ($result = $mysqli->query($query)) {

    while ($row = $result->fetch_assoc()) {
        echo 'Usuário ', $row['nome'], ' está ',
             (isOnline($row['lastactive']) ? 'online' : 'offline'), '<br>';
    }

    $result->free();
}

В Этом примере, если пользователь находится без выполнения деятельность более 2 минут, то он считается "не в сети" для других пользователей или любое другое действие, просто использовать функцию isOnline, если TRUE " может выполнять команды пользователя, потому что он online, если FALSE он находится в "автономном режиме", таким образом вы можете пропустить или, наоборот, будет зависеть от того, что вы хотите сделать с пользователей online/offline.

 5
Author: Guilherme Nascimento, 2017-04-13 12:59:31

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

1° Войти

, Когда человек войти в систему проверке делать select пользователя и пароль и положительные создает сеанс для него, чтобы остаться вошли в систему правильно? вы можете создать два поля, idnet и dataAcesso в Базе данных и обновляет его ключ и текущую дату. (Idnet - ключ), чтобы определить, какую систему вы используете, вы можете создать таким образом:


function geraidnet() {
   $idnet = rand();
   $idnet = mb_strtoupper(md5($idnet));
   $_SESSION['IDNET'] = $idnet;
   return $idnet;
}

$idnet = geraidnet();

DataAcesso и, чтобы проверить время, что человек этот праздный. Вы можете обнулить idnet и dataAcesso, когда человек может оставаться в состоянии бездействия, например, 5 минут:


 $sql = 'UPDATE USUARIOS' . "\n" .
        '   SET DATA_ACESSO = NULL ,' . "\n" .
        '       IDNET = NULL' . "\n" .
        ' WHERE DATA_ACESSO menorQ (CURRENT_TIMESTAMP - 0.00347)';

Всех пользователей, которые остались 5 минут простоя системы будет иметь свои idnet и dataAcesso вычеркнутые теперь вы можете сделать select, чтобы проверить, сколько пользователей находятся вошли.



$sql = 'SELECT COUNT(0) AS QUANT_UL' . "\n" .
        '  FROM USUARIOS' . "\n" .
        ' WHERE DATA_ACESSO IS NOT NULL';

if (($result = $db->Execute($sql)) == false):
   throw new Exception($db->ErrorMsg());
endif;

if ($result->fields['QUANT_UL'] menorQ 10): // só pode haver ate 10 conexões
   $sql = 'UPDATE USUARIOS' . "\n" .
           '   SET DATA_ACESSO = \'' . $data_acesso . '\',' . "\n" .
           '       IDNET       = \'' . $idnet . '\'' . "\n" .
           ' WHERE id      = ' . $idusuario;
else:
   throw new Exception('O número máximo de conexões foi atingido!');
endif;

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

 1
Author: Gabriel Rodrigues, 2020-06-11 14:45:34