Зарегистрированные пользователи PHP

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

Что у меня: Когда пользователь входит в систему, они получают сеанс (который используется, когда пользователь хочет посетить защищенную страницу), а столбец IsLoggedIn для пользователя в таблице users равен 1, чтобы указать, что пользователь зарегистрирован Когда пользователь выходит из системы, значение возвращается к 0. Подсчет количества 1 в таблице пользователей позволяет легко вернуть количество зарегистрированных пользователей. Но…

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

Вопрос: Может ли кто-нибудь предложить правильный способ сделать это?

    Вместо столбца IsLoggedIn следует добавить столбец LastTimeSeen. Каждый раз, когда человек посещает страницу, вы обновляете столбец:

    UPDATE members SET LastTimeSeen = NOW() WHERE id = $the_user_id 

    Затем, чтобы узнать, сколько людей на сайте в любой момент вы используете запрос:

     SELECT COUNT(*) FROM members WHERE LastTimeSeen > DATE_SUB(NOW(), INTERVAL 5 MINUTE) 

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

    Просто предложить другое решение:

     if ($user->isLoggedIn()) { touch("/writable/path/loggedInUsers/" . $user->id); } 

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

    Из-за того, как строился наш сайт, необходимо было использовать подход ajax. Я использую jQuery, поэтому он относительно безболезнен.

    Эти строки вошли в функцию $ (document) .ready.

     fnShowImOnline(); setInterval('fnShowImOnline', 120000); 

    Это функция javascript …

     function fnShowImOnline() { $.get('ajax/im_online.php'); } 

    И вот PHP

     <?php session_start(); if ((isset($_SESSION['user']))&&($_SESSION['authorized']=='authorized')) { include('../includes/db.php'); db_connect(); mysql_query("UPDATE members SET last_checked_in = NOW() WHERE user_id = {$_SESSION['user']['user_id']}"); } ?> 

    Счет – это прямой PHP / mySQL.

     // Members online. $online_sql = "SELECT COUNT(*) FROM members where last_checked_in > DATE_SUB(NOW(), INTERVAL 5 MINUTE)"; $online_RS = mysql_query($online_sql); $online_row = mysql_fetch_row($online_RS); $online = $online_row[0]; 

    В те времена мне нужно обновлять числа динамически, этот бит ajax делает трюк.

     $.ajax({ url: 'ajax/members_online.php', dataType: 'json', success: function(response) { if (!isNaN(response.total)) { $('#OnlineTotal').html(response.total + " Total "); $('#OnlineOnline').html(response.online + " Online Now"); } } }) 

    используя это для PHP / mySQL

     // Members online. $online_sql = "SELECT COUNT(*) FROM members WHERE last_checked_in > DATE_SUB(NOW(), INTERVAL 5 MINUTE)"; $online_RS = mysql_query($online_sql); $online_row = mysql_fetch_row($online_RS); $online = $online_row[0]; // Members total. $total_sql = "SELECT COUNT(*) FROM members"; $total_RS = mysql_query($total_sql); $total_row = mysql_fetch_row($total_RS); $total = $total_row[0]; $response = json_encode(array('total'=>$total,'online'=>$online)); echo($response); 

    Это хорошо работает для нас.