首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >找出在PHP中有多少用户在线?

找出在PHP中有多少用户在线?
EN

Stack Overflow用户
提问于 2009-05-20 23:57:13
回答 4查看 4.6K关注 0票数 1

每次访问我的网站都会更新用户的个人点击计数器,并根据存储在cookie中的ip地址和id更新time()的一列。因此,在输出数据时,下面的代码有什么更有效的方式来减少数据库调用,因为它本质上是自身的副本:

代码语言:javascript
复制
<?
$last1Min = time()-60;
$last5Mins = time()-300;
$last1Hr = time()-6000;
$last1Dy = time()-144000;
$last1Wk = time()-1008000;
$last1Mnth = time()-30240000;

//last1Min
$sql = "SELECT COUNT(*) FROM usersonline WHERE lastOnline > $last1Min";
while($rows = mysql_fetch_array(mysql_query($sql))) {
    echo "Users online in the last minute: " . $rows['COUNT(*)'] . "<br />\n";
}

//last5Mins
$sql = "SELECT COUNT(*) FROM usersonline WHERE lastOnline > $last5Mins";
while($rows = mysql_fetch_array(mysql_query($sql))) {
    echo "Users online in the last 5 minutes: " . $rows['COUNT(*)'] . "<br />\n";
}

//last1Hr
$sql = "SELECT COUNT(*) FROM usersonline WHERE lastOnline > $last1Hr";
while($rows = mysql_fetch_array(mysql_query($sql))) {
    echo "Users online in the last hour: " . $rows['COUNT(*)'] . "<br />\n";
}

//last1Dy
$sql = "SELECT COUNT(*) FROM usersonline WHERE lastOnline > $last1Dy";
while($rows = mysql_fetch_array(mysql_query($sql))) {
    echo "Users online in the last day: " . $rows['COUNT(*)'] . "<br />\n";
}

//last1Wk
$sql = "SELECT COUNT(*) FROM usersonline WHERE lastOnline > $last1Wk";
while($rows = mysql_fetch_array(mysql_query($sql))) {
    echo "Users online in the last week: " . $rows['COUNT(*)'] . "<br />\n";
}

//last1Mnth
$sql = "SELECT COUNT(*) FROM usersonline WHERE lastOnline > $last1Mnth";
while($rows = mysql_fetch_array(mysql_query($sql))) {
    echo "Users online in the last month: " . $rows['COUNT(*)'] . "<br /><br />\n";
}

如果有一种更有效的方式来呈现这些数据,我想扩展它,不仅显示每个指标的用户在我的整个网站上有多少人在线,而且记录和输出我网站上每个页面的数据。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-05-21 00:22:56

代码语言:javascript
复制
SELECT 
  SUM(lastOnline <= 60) AS one_minute,
  SUM(lastOnline <= 300) AS five_minutes,
  ...
  SUM(lastOnline <= 30240000) AS one_month
FROM usersonline

使用这种方法,您可以通过单次表扫描在单个查询中获得所需的所有内容;它的效率不会比这个更高。正如其他人提到的,您应该缓存结果,因为它相对昂贵(即使是在这种优化的形式下)。计算每个页面的负载是没有意义的,特别是如果你每秒看到多个点击(如果你点击digg的首页,这是极有可能的)

对于条件为真的行,lastOnline <= 60的计算结果为1;对于条件为假的行,计算结果为0;SUM()对这两个1和0求和,得到条件为真的行数的计数。

几年前从mysql文档中的用户评论中学到了这项技术;有similar examples elsewhere

票数 5
EN

Stack Overflow用户

发布于 2009-05-21 00:04:42

设置一个cron作业,每分钟/5分钟/其他时间只计算一次正确值。缓存结果并显示结果。当这些统计数据每分钟或每半小时只改变一次时,真的没有必要每秒计算X次。

票数 3
EN

Stack Overflow用户

发布于 2009-05-21 00:01:37

您可以只调用上个月内的所有时间,并按日期排序,而不是为每个时间调用数据库。然后,在php中,您可以比较日期和时间,以查看用户上次登录有多长时间。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/890820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档