Как определить, вышел ли пользователь из системы в php?

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

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

РЕДАКТИРОВАТЬ: Извините, если мой вопрос не ясен. Я использовал сеанс, чтобы сохранить, вошли ли они в систему или нет. Но теперь я хочу сохранить информацию в базе данных, чтобы я мог отображать их статус на других страницах. Допустим, у пользователя user1 3 друга. При отображении всех своих друзей user1 хочет знать, находятся ли его друзья в сети или офлайн. Это то, что я хочу. Какой-нибудь совет?


person Community    schedule 20.05.2009    source источник


Ответы (12)


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


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

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

  • Создайте столбец в своей пользовательской таблице по строкам last_activity.
  • Каждый раз, когда пользователь загружает страницу, обновите их last_activity до текущего времени.
  • Чтобы получить список тех, кто находится в сети, просто запросите в базе данных пользователей со значениями last_activity более поздними, чем 10/20 минут назад.
person ceejayoz    schedule 20.05.2009
comment
Я однажды использовал метод, который вы описали для проекта, и он отлично работает. вы даже можете использовать функции даты и времени mysql, такие как timediff () и (time_to_sec (timediff (now (), last_activity))), чтобы показать период (последнее действие: 15 минут назад). - person stefs; 20.05.2009
comment
Похоже, это сделает базу данных очень загруженной, если каждая посещенная страница будет нуждаться в обновлении базы данных. есть ли какой-нибудь легкий способ, как предложил Гамбо? Я не очень понимаю его комментарий, не очень понимаю ... - person ; 20.05.2009
comment
Если ваш сайт настолько загружен, что лишний запрос на страницу тормозит вашу систему, кто в сети? страница будет настолько огромной, что в любом случае будет бесполезна. Метод сеанса Гамбо не работает для тех, кто в сети? страница. - person ceejayoz; 21.05.2009
comment
@show_lol, для предотвращения потенциальной нагрузки на db вы можете отслеживать последний раз, когда вы обновляли свою базу. Например, если с момента последнего обновления базы данных прошло менее одной минуты, может не потребоваться повторное обновление. - person Haluk; 04.04.2010

Сохраните отметку времени каждой активности пользователя. Когда это время больше 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();
}

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

person Gumbo    schedule 20.05.2009
comment
применимо ли это для более чем 1 пользователя? Если я хочу перечислить 10 пользователей, хочу проверить, что 10 пользователей в сети, как это сделать? - person ; 20.05.2009
comment
opps, извините .. я знаю, если последняя активность более 10 минут, я перенаправлю на страницу php, скажу моей базе данных, что этот пользователь вышел из системы? это то, что ты имеешь в виду? - person ; 20.05.2009
comment
Комментарии описывают значение каждой ветки. Таким образом, «последнее действие было более 10 минут назад» означает, что эта ветка была введена, если последнее действие было более 10 минут назад, поэтому он был неактивен более 10 минут. Для логики вашего приложения это означает ваше дело. - person Gumbo; 20.05.2009
comment
Но если вы хотите получить список «текущих» онлайн-пользователей, вам нужен источник, к которому у вас есть постоянный доступ отовсюду. Так что вам лучше использовать решение для базы данных. - person Gumbo; 20.05.2009
comment
спасибо гамбо, но я не очень понимаю, что ты имеешь в виду. Источник, который постоянно доступен везде? Извините, я новичок в php и совсем не разбираюсь в php - person ; 20.05.2009
comment
В базе данных вы всегда можете получить доступ ко всем наборам данных одновременно. Но в сеансе вы можете получить доступ только к одному набору данных за раз: к тому, который связан с идентификатором сеанса. - person Gumbo; 20.05.2009

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

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

person Ólafur Waage    schedule 20.05.2009

Если вы пытаетесь отслеживать пользователей, которые находятся в сети, вы можете рассмотреть возможность использования сеанса для отдельного пользователя и вместо сохранения login = true в базе данных, чтобы отображать их статус для вас или других, сохраните время последней активности для Пользователь. Когда вы открываете свой список онлайн-пользователей, создайте свой sql-запрос, чтобы возвращать только пользователей с last_activity в течение последних 10 минут.

person Eddy    schedule 20.05.2009

Возможно, лучше сохранить login = true в переменной сеанса, чтобы проверить, вошел ли пользователь в систему. Это решит большинство ваших проблем;)

person Ropstah    schedule 20.05.2009

Обычно вы помещаете такую ​​информацию в сеансы.

$_SESSION['user'] = "A user name";

Затем, когда вы хотите выйти, вы делаете:

session_destroy();

Дополнительная информация о сеансах здесь и руководство.

person MrHus    schedule 20.05.2009
comment
Я знаю. Но если пользователь закроет браузер? Моя база данных по-прежнему имеет статус верный, верно? Я хочу показать, находится ли пользователь в сети или в автономном режиме. - person ; 20.05.2009
comment
Статус должен быть datetime, тогда каждый раз, когда пользователь что-то делает, вы можете обновлять это поле. Если пользователь был активен последние полчаса, можно сказать, что он вошел в систему. Или что-то подобное. - person MrHus; 20.05.2009

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

person developer    schedule 20.05.2009

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

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

person gacrux    schedule 20.05.2009

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

person Michal M    schedule 20.05.2009

Это расширение того, что 'ceejayoz "сказал ранее.

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

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

Ниже приводится несколько непроверенных примеров кода, с которыми вы можете начать. Вы можете использовать «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
}
person StackKrish    schedule 20.05.2009
comment
предостережение: вы можете сделать DDoS-атаки на свой сайт таким образом, если у вас большое количество пользователей. - person Piskvor left the building; 10.06.2009
comment
Истинный. Кстати, я бы не стал этим заниматься. Но предлагается только как решение проблемы, описанной в Исходном посте. - person StackKrish; 12.06.2009

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

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

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

person Jet    schedule 20.05.2009

Вы можете сделать это с помощью комбинации способов, в лучшем случае 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>   
person Nwachukwu A. Nnaemeka    schedule 22.06.2014