2014-02-15 4 views
1

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

// log out the user after 60 seconds of inactivity 
    if (isset($_SESSION['timestamp'])) { 
     $elapsed_time = time() - $_SESSION['timestamp']; 
     if ($elapsed_time >= 900) { 
      mysql_query("UPDATE `users` SET `status` = '0' WHERE `user_id` = '$session_user_id'"); 
      session_destroy(); 
      header('Location:index.php'); 
     } 
    } 
    $_SESSION['timestamp'] = time(); 

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

+2

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

+1

Вместо использования поля 'status' вы должны использовать поле' last_active'. Вы можете [infer] (https://en.wikipedia.org/wiki/Inference) бездействовать, исходя из того, когда произошло последнее действие пользователя. Отслеживание статуса пользователя по своей сути ненадежно в системе без учета штата, например в Интернете. –

+0

Я использую статус, чтобы определить, должен ли пользователь иметь зеленую или красную точку рядом с их именем пользователя. как я могу достичь этого, используя last_active? вы можете дать мне пример кода? –

ответ

0

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

+0

Конечно, нет смысла хранить одну и ту же информацию в двух отдельных полях базы данных (в любом случае она нарушает правила нормализации). Но нет необходимости * обновлять * время последнего действия - это все равно работает диспетчер сеансов. – symcbean

0

выполнить OnUnload скрипт

Один из вариантов, чтобы выполнить код JavaScript, каждый раз, когда выгружает документ:

<body onunload="ajaxDoLogoff()"> 

с

function ajaxDoLogoff() { 

    xmlhttp.open("GET", "performLogoff.php", false); 
    xmlhttp.send(); 

} 

Отслеживайте активность пользователя и аннулируйте все неактивные пользователи

Или добавьте поле lastActivity INT(11) пользователю table который содержит временную метку unix.

Если пользователь делает Войти или зарегистрированный пользователь возвращает, следить за его деятельностью:

$query = 'UPDATE `users` ' 
     . ' SET `status`   = "1", ' 
     . '  `lastActivity` = "' . $time() . '" ' 
     . ' WHERE (`userID`  = "' . $userID . '") ' 
     ; 

mysql_query($query); 

Достаточно часто, сделать очистку устаревших сессий:

$deadSessionTimestamp = time() - $thresholdInSeconds; 

$query = 'UPDATE `users` ' 
     . ' SET `status` = "0" ' 
     . ' WHERE (`lastActivity` < "' . $deadSessionTimestamp . '") ' 
     ; 

mysql_query($query); 

Побочное действие: приложение теперь отслеживает последнее действие каждого пользователя.

Bonus: Показать последнюю активность дату/время после операции входа

Используя этот запрос

$query = 'SELECT `lastActivity ` ' 
     . ' WHERE (`userID` = "' . $userID . '") ' 
     ; 

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

+0

не будет ли это работать как журнал, как вы на сайте? и я не слишком уверен, как использовать часть javascript. –

+0

@Bamba Нет, это отходит от каждого пользователя с устаревшим состоянием активности. Вам просто нужно выполнить нижний запрос, достаточно часто. Простейшим местом будет index.php, если каждый запрос приходит через этот скрипт. Обратите внимание, что могут существовать лучшие сценарии, которые реже выполняют нижний запрос. Фактически, вы даже можете выполнить нижний скрипт, используя задание CRON. – SteAp

+0

Я сделал это mysql_query («UPDATE' users' SET 'status' = '1' WHERE' user_id' = '". $ Session_user_id."' И 'lastActivity' = '". Timestamp().' ""); и он говорит мне неопределенный timestamp() –

1

Marc B предлагает вам «Запустить запланированное задание в вашей системе, чтобы выходить из системы тем, кто простаивал дольше, чем установленный период» - однако это ничем не отличается от того, что делает сбор мусора в обработчике сеанса.

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

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

Смежные вопросы