我无法弄清楚如何计算我的应用程序中的登录用户数。
我所拥有的:当用户登录时,他们会获得一个会话(当用户想要访问受保护的页面时使用该会话),并且用户表中用户的 IsLoggedIn 列设置为 1 以指示用户已登录in。当用户注销时,该值被设置回0。统计users表中1的个数,可以很容易地返回登录用户的数量。但...
问题:如果用户在没有注销的情况下关闭浏览器,则数据库中的值保持为 1,这表明用户在关闭浏览器时会话已经结束,但仍处于登录状态。
问题:有人可以建议一种正确的方法吗?
我无法弄清楚如何计算我的应用程序中的登录用户数。
我所拥有的:当用户登录时,他们会获得一个会话(当用户想要访问受保护的页面时使用该会话),并且用户表中用户的 IsLoggedIn 列设置为 1 以指示用户已登录in。当用户注销时,该值被设置回0。统计users表中1的个数,可以很容易地返回登录用户的数量。但...
问题:如果用户在没有注销的情况下关闭浏览器,则数据库中的值保持为 1,这表明用户在关闭浏览器时会话已经结束,但仍处于登录状态。
问题:有人可以建议一种正确的方法吗?
您应该添加 LastTimeSeen 列,而不是 IsLoggedIn 列。每当有人访问页面时,您都会更新该列:
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 秒以下的文件时间。
由于我们网站的构建方式,有必要使用 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);
这对我们来说效果很好。