繁体   English   中英

找出有多少用户在线使用PHP?

[英]Find out how many users are online in PHP?

每次访问我的网站都会更新用户的单个点击计数器,并根据存储在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";
}

如果有一种更有效的方式来显示此数据,我想对其进行扩展以不仅显示整个站点上每个指标的在线用户数,还记录并输出站点上每个页面的数据。

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;对于条件为假的行,lastOnline的结果为0; SUM()将这些1和0相加,得出条件为真的行数。

几年前从mysql文档中的用户评论中学到了这项技术; 其他地方也有类似的例子

设置一个cron作业,该作业每分钟/ 5分钟/等仅计算一次正确的值。 缓存结果并显示出来。 当这些统计信息每分钟更改一次或每半小时更改一次时,实际上并不需要每秒计算X次。

不必每次都调用数据库,您只需在上个月内调用所有数据库,然后按日期对它们进行排序即可。 然后在php中,您可以比较日期和时间,以查看用户上次登录的时间。

如果将会话保存到文件,则可以计算一个时间段内已访问的文件数。 这样就根本没有数据库访问权限。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM