Как определить, что пользователь вышел из системы, в php? - PullRequest
9 голосов
/ 20 мая 2009

После успешного входа в систему я сохраняю логин = true в базе данных. Но как я могу проверить, вышел ли пользователь, закрыв браузер, не нажимая кнопку выхода? А также, как мне перенаправить пользователя, который был неактивен в течение 10 минут, на страницу входа?

Я использую php и mysql. Любая помощь будет оценена.

EDIT: Извините, если мой вопрос не ясен. Я использовал сессию для хранения, вошли они или нет. Но теперь я хочу сохранить информацию в базе данных, чтобы я мог отображать их статус на других страницах. Допустим, у пользователя 1 есть 3 друга. При отображении всех своих друзей, user1 хочет знать, в сети он или нет. Это то, что я хочу. Любой совет?

Ответы [ 12 ]

13 голосов
/ 20 мая 2009

2017 edit: В наши дни лучше всего использовать веб-сокеты для отслеживания присутствия на странице / сайте.


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

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

  • Создайте столбец в вашей пользовательской таблице вдоль строк 'last_activity'.
  • Всякий раз, когда пользователь загружает страницу, обновите его last_activity до текущего времени.
  • Чтобы получить список тех, кто в сети, просто запросите в базе данных пользователей со значениями last_activity, более поздними, чем 10/20 / в течение нескольких минут назад.
8 голосов
/ 20 мая 2009

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

В PHP вы можете сделать что-то вроде этого:

session_start();
if (!isset($_SESSION['LAST_ACTIVITY'])) {
    // initiate value
    $_SESSION['LAST_ACTIVITY'] = time();
}
if (time() - $_SESSION['LAST_ACTIVITY'] > 3600) {
    // last activity is more than 10 minutes ago
    session_destroy();
} else {
    // update last activity timestamp
    $_SESSION['LAST_ACTIVITY'] = time();
}

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

2 голосов
/ 20 мая 2009

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

Чтобы быть в безопасности, вы должны отслеживать последнее действие пользователя, и если оно прошло несколько минут (5/10), то предположить, что пользователь ушел. Если он снова что-то сделает (например, через 6 минут), он снова в сети.

1 голос
/ 20 мая 2009

Если вы пытаетесь отследить пользователей, которые «в сети», то вы можете рассмотреть возможность использования сеанса для отдельного пользователя и вместо сохранения логина = true в БД для отображения их статуса для вас или других, сохраните последнее действие время для пользователя. Когда вы откроете свой список онлайн-пользователей, создайте SQL-запрос, чтобы в течение последних 10 минут возвращались только пользователи с 'last_activity'.

0 голосов
/ 22 июня 2014

Вы можете сделать это с помощью комбинации способов, самое большее 2, я думаю, с тем, который мешает последнему действию, вы комбинируете это с использованием jQuery для проверки на бездействие, то есть в течение некоторого времени нет событий мыши или клавиатуры, скажем, от 10 до 20 минут, а затем, когда время простоя подтверждено, вы делаете ajax-вызов php-файла, который обновит вашу таблицу базы данных, показывая пользователя в автономном режиме.

Вы можете начать с:

<script type="text/javascript">
idleTime = 0;
$(document).ready(function () {
//Increment the idle time counter every minute.
var idleInterval = setInterval(timerIncrement, 60000); // 1 minute

//Zero the idle timer on mouse movement.
$(this).mousemove(function (e) {
    idleTime = 0;
});
$(this).keypress(function (e) {
    idleTime = 0;
});
});

function timerIncrement() {
idleTime = idleTime + 1;
if (idleTime > 19) { // 20 minutes
    $.ajax({
     url: 'update_user.php',
     type: 'POST',
     datatype: 'json',
     data: someData
    });
}
}
</script>   
0 голосов
/ 20 мая 2009

ИМХО, лучший способ - сохранять метку времени последней активности в БД при каждом обновлении пользовательской записи. После выхода из системы или тайм-аута (оставьте тайм-ауты с помощью cronjob) просто установите для него нулевое значение и используйте в качестве флага.

$user = new User($user_id);
$user->logged_in = (bool)($last_activity > 0);

Иногда вам нужно что-то сказать. как "последний раз видели ...", затем оставьте последнее действие и просто добавьте логический флаг (tinyint) logged_in в свою таблицу пользователей.

0 голосов
/ 20 мая 2009

Это расширение того, что было сказано ранее * ceejayoz .

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

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

Ниже приведен пример непроверенного примера кода, с которого вы начнете. Вы можете использовать «PING__FREQUENCY» для управления частотой, с которой пользовательская активность будет обновлять столбец last_activity.

define(PING_FREQUENCY,300); //5 mins
if (($_SESSION['lastPingTime'] + PING_FREQUENCE) > time()) {
    stillLoggedIn(); //execute a function to tell that the user is still logged in
}

function stillLoggedIn() {
    //Do SQL update to mark the last activity time for the user
}
0 голосов
/ 20 мая 2009

AFAIK, у вас нет возможности проверить, когда человек закрывает окно браузера (или оставляет вашу страницу, чтобы перейти к другому), поэтому вам нужно проверить активность, как другие предложили выше.

0 голосов
/ 20 мая 2009

Было бы лучше использовать сеанс для контроля состояния входа в систему.

Прочтите эту информацию о сеансах

0 голосов
/ 20 мая 2009

Почему вы не используете сеанс или куки для этого вместо того, чтобы вставить их в базу данных. Вы можете установить куки, используя функцию setcookie (), или вы можете сделать сеанс доступным и сохранить в нем значение.

...