Intereting Posts
как отправить html-элементы через JSON, используя php Извлечение данных из базы данных на основе ввода пользователем Как получить значение поля ввода с помощью PHP При доступе к веб-странице в java тело моей php-страницы становится ошибкой в ​​javascript Исключение одиночных кавычек в PHP / MySQL не работает Хорошая обработка ошибок с помощью file_get_contents REQUEST_URI: echo $ url: получить только количество URL-адресов Учитывая местоположение пользователя, выберите строки, которые включают этого пользователя в их радиус Проблема кодирования символов с PDO_ODBC ОТЧЕТ НАЗАД в PHP или JAVASCRIPT? Как очистить preg_match_all от пустых значений массива PHP Неустранимая ошибка: класс HttpRequest не найден Сеятель работает отлично в первый раз, но не выполняет некоторые задачи в последующих циклах в Laravel 5? Как я могу сделать многоязычный сайт? Apache rewrite – очистить URL-адреса в localhost

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

Затем, когда вы хотите выйти из системы, выполните следующие действия:

 session_destroy(); 

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

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

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

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

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

Это расширение для того, что сказал ранее « ceejayoz ».

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

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

Ниже приведен пример непроверенного примера кода, с которого вы начинаете. Вы можете использовать «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 } 

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

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

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

Вы можете сделать это с помощью комбинации способов, по крайней мере, я полагаю, с одним, кто беспокоится о последнем действии, вы комбинируете его с использованием 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>