到网上查了一下,说,HTTP是无状态协议,就是服务器接受请求,建立连接,然后加载网页,载入完毕,对话结束,所以无法真正统计出在线人数,只能统计出在某个时间间隔内,比如半个小时内,访问过的人数,算并发访问的人数。
实现原理可以是,把每次访问的时间、IP记录下来,放到一个数据库表内,然后,读最近一个时间段内的不同IP的记录数,就算在线人数。
待续
< ? php
/************************************
功 能:统计在线人数
参 数:$st_url,需要统计的页面网址
$time_slot:时间间隔(单位:秒)
返回值:多维数组
***********************************/
//--------------------
#数据表:readers_online
#rs_ip varchar(32): IP地址, 为IPv6作准备
#rs_url varchar(20):页面url
#rs_time int(10) :登陆时间
#rs_username varchar(20):用户名
//--------------------
class OnlineReaders
{
function rsonline($db, $pageurl, $time_slot, $lg_user)
{
//当前时间和IP地址和用户
$cur_time = time();
$cur_ip = $_SERVER['REMOTE_ADDR'];
$rs_user=$lg_user==""? "anonymous" : $lg_user;
//删除数据表中过期的信息和相同IP地址的数据
$sql = "delete from readers_online where $cur_time - rs_time > $time_slot ";
$sql.= "or rs_ip='".$cur_ip."'";
mysql_query($sql);
//插入新数据
$sql = "insert into readers_online (rs_ip, rs_url, rs_time, rs_username) values(";
$sql.= "'".$cur_ip."','".$pageurl."','".$cur_time."','".$rs_user."')";
mysql_query($sql);
//读出在线总人数和他们的用户名
$sql = "select * from readers_online ";
$query = mysql_query($sql);
$all_sum = mysql_num_rows($query);
$rg_user_sum = 0; //注册用户数量
$visitors_sum = 0; //访客数量
while($r_visitors=mysql_fetch_object($query))
{
if($r_visitors->rs_username !='anonymous' )
{
$user_info[$rg_user_sum] = $r_visitors->rs_username;
$rg_user_sum++;
}
else
{
$visitors_sum++;
}
}
return array($all_sum,$visitors_sum,$user_info);
}
}
? >