簡體   English   中英

PHP計數登錄用戶

[英]PHP Count Logged-In Users

我在弄清楚如何計算應用程序中已登錄用戶的數量時遇到了麻煩。

我所擁有的:用戶登錄時,他們獲得一個會話(該會話在用戶要訪問受保護的頁面時使用),並且用戶表中該用戶的IsLoggedIn列設置為1以指示該用戶已登錄當用戶注銷時,該值重新設置為0。對users表中的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);
}

如果您不需要查詢此數據,則本地文件訪問比數據庫寫入快得多。 要登錄用戶,請在目錄中掃描N秒鍾以內的filemtimes。

由於我們網站的構建方式,因此有必要使用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);

這對我們來說很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM