回 帖 发 新 帖 刷新版面

主题:统计在线人数??

http是无连接协议,该如何得知用户在线,又如何进行实时在线人数统计???30分

回复列表 (共5个回复)

沙发

记数器可完成访问 web 页的总次数,但却不能得知一个时段中访问量的动态记载,下面就来介绍如何写一个各个时段动态显示访问量的方法. 

要记载访问量,首先就要在 mysql 内建立一个数据库,姑且给这个数据库取名为 line,同时建立一个名为 line 的数据表,表内的字段分别为"用户名(name varchar(20)),时间(time datetime)".当然读者也可根据需要增加数据表的字段. 

建立好数据库后,就可以开始设计程序了,现在先理清一下思路,要想显示访问量,当然数据库就必须要有记录,我已假设读者有能力写一个用户登入程序了,所以向数据库添加纪录可在登入程序假设为 login.php 里添加: 

先给现在时间付值:$time=date('Y-m-d H:i:s'); 
mysql_select_db(line); 
mysql_query("insert into line (name,time) values('$name','$time')"); 

好了,现在每一位登入的用户在数据库里都有了一个记录,下面就来完成用户在线显示的程序 line.php: 

<? 
mysql_connect("local","",""); 
mysql_select_db(line); 
$result=mysql_query("select * from line"); 
$num=mysql_numrows($result); 
if (!empty($num)) { 
echo "<table><tr><td>"; 
echo "现在在线人数为:$num"; 
echo "</td></tr>"; 
for($i=0;$i<$num;$i++){ 
$name=mysql_result($result,$i,"name"); 
echo "<tr><td>用户:$name</td></tr>"; 


?> 

上面这段程序已能显示所有在线的用户人数及各用户名,当然这个程序还很不完善.如果其中一个用户登出离开后,数据库就不应该有此用户的记录所以,还得在登出程序假设为 logout.php 内加上删除功能: 

mysql_select_db(line); 
mysql_query("delete from line where name='$name'"); 

这时一个基本的用户在线功能已经完成,接下来继续在 line.php 内增加代码使功能更加完善,首先我们得规定用户在多长时间没继续浏览 line.php 时就认为该用户已经离开,这里给定一个时间限制为 5 分钟,也就是说程序将显示从现在开始的前 5 分钟的用户情况,所以必须 line.php 内设置一个现在时间告知程序从这个时间开始执行,然后实现程序执行时把数据库内记录的时间减去现在时间大于 5 分钟的所有记录删除,这样任何用户在执行 line.php 时,都能看到 5 分钟内的所有在线的用户,完成这个功能需要以下这个数据库语句: 

delete from line where time<date_sub('$time',interval 5 
minute) 

但是其中还有一个问题就是如果有个用户一直在不停地执行 line.php 超过 5 分钟以上时,程序必须得分辨出该用户并一直显示该用户,在这就得利用 cookie 来实现更新数据库的时间记录了,因为是登入认证的,所以会有个 cookie 来记住用户的资料的,假设这个记录用户姓名的 cookie 变量为 $cookiename (具体的变量视 cookie 的设置而定),剩下的就很好办了,利用这个 cookie 变量完成数据库的修改: 

update line set time='$time' where name='$cookiename' 

下面来完善 line.php: 

<? 
//设置现在的时间 
$time=date('Y-m-d H:i:s'); 
mysql_connect("local","",""); 
mysql_select_db(line); 

//更新用户的记录 
mysql_query("update line set time='$time' where name='$cookiename'"); 

//删除超过 5 分钟的用户记录 
mysql_query("delete from line where time<date_sub('$time',interval 5 minute)"); 

$result=mysql_query("select * from line"); 
$num=mysql_numrows($result); 
if (!empty($num)) { 
echo "<table><tr><td>"; 
echo "现在在线人数为:$num"; 
echo "</td></tr>"; 
for($i=0;$i<$num;$i++){ 
$name=mysql_result($result,$i,"name"); 
echo "<tr><td>用户:$name</td></tr>"; 


?> 

好用户在线显示功能完成

板凳

说得很详细,感谢~~!!

但是这个方法存在一个缺陷就是不够实时,比如在3分钟之前用户A关掉浏览器走人了

而此时用户B刚上线,在B看来A还是在线的,因为A没有经过 logout.php

还有更好的方法吗? 比如利用 session 之类的能不能实现这个功能?

3 楼

那么你就在关闭浏览器的时候跳出一个询问框,问是否退出,如果选否就不关闭,如果选是就把记录删除,再关闭浏览器!这样可以了吧!

4 楼

传统的方法都是这样的吗???

别外我对JS不堪了解,这样的JS该如何写???

真要这么做的话,我岂不是要在每个html页面中都用到该JS ??

因为我并不知道他会在哪个页面关闭浏览器!!

再者还会导致JS对本已超时的访问(比如空闲6分钟没有与服务端联系)询问是否退出~~`

5 楼

传统的方法就是1楼所写的!
如果你觉得三分钟过长,就改成一分钟吧!再不是就30秒了!
再说网络会有延时,在线列表刷新也是要时间的!

我来回复

您尚未登录,请登录后再回复。点此登录或注册