每次访问我的网站都会更新用户的个人点击计数器,并time()根据他们的IP地址和存储在cookie中的ID 更新列.因此,在输出数据时,使用较少的数据库调用,以下代码的更有效方式是什么,因为它本质上是自身的副本:
<?
$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";
}
Run Code Online (Sandbox Code Playgroud)
如果有一种更有效的方式来呈现这些数据,我想扩展它,不仅要显示每个指标在我的整个网站上有多少用户在线,还要记录并输出我网站上每个页面的数据.
SELECT
SUM(lastOnline <= 60) AS one_minute,
SUM(lastOnline <= 300) AS five_minutes,
...
SUM(lastOnline <= 30240000) AS one_month
FROM usersonline
Run Code Online (Sandbox Code Playgroud)
使用此方法,您可以通过单个表扫描在单个查询中获得所需的一切; 它并没有比那更有效率.正如其他人所提到的,你应该缓存结果,因为它相对昂贵(即使在这种优化的形式).在每次页面加载时计算这一点都没有意义,特别是如果你每秒看到多次点击(如果你这么做,那么,如果你点击了digg的头版那么极有可能)
对于条件为真的行,lastOnline <= 60的计算结果为1;对于条件为假的行,则计算结果为0; SUM()将这些1和0相加,为您计算条件为真的行数.
几年前从mysql文档中的用户评论中学到了这种技术; 其他地方有类似的例子