了解PHP中有多少用户在线?

时间:2009-05-20 23:57:13

标签: php count

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

<?
$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";
}

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

4 个答案:

答案 0 :(得分:5)

SELECT 
  SUM(lastOnline <= 60) AS one_minute,
  SUM(lastOnline <= 300) AS five_minutes,
  ...
  SUM(lastOnline <= 30240000) AS one_month
FROM usersonline

使用此方法,您可以通过单个表扫描在单个查询中获得所需的一切;它并没有比那更有效率。正如其他人所提到的,你应该缓存结果,因为它相对昂贵(即使在这种优化的形式)。在每次页面加载时计算这一点都没有意义,特别是如果你每秒看到多次点击(如果你这么做,那么,如果你点击了digg的头版那么极有可能)

lastOnline&lt; = 60对条件为true的行求值为1,对条件为false的行求0; SUM()将这些1和0相加,为您计算条件为真的行数。

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

答案 1 :(得分:3)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

如果将会话保存到文件,则可以计算在一段时间内访问过的文件数。然后根本没有数据库访问。