[英]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.