web开发之在线人数统计
需求:
统计当前在线人数(当前访问网站的用户)
思路:
第一步,把访客的信息存入到数据库,每次访问或者刷新页面的时候,都更新该访客在数据库中的记录,也就是更新该访客的最后活动时间。
第二步,删除很长时间 “无动作” 的访客记录,保证数据表里面的数据最新。
问题:
思路中的第一步没有问题,问题在于第二步。假设我的应用访客并发数为100万,那么我的数据访客表中的数据至少有100万条,如果每个用户每次访问都要遍历整张表,找出“无动作”的用户,然后把他的记录删掉,所耗资源太大。
解决方法:
模仿session的回收机制。php处理session的机制是,设置一个概率,让用户有一定概率触发php的垃圾回收程序,从而删除没用的session文件。php的配置文件里面有session.gc_probability = 1;session.gc_divisor = 100;这两个设置,这里表示有1/100的概率触发gc进程。就是说,100个用户访问,当调用session_start()的时候,可能会有一次触发gc进程,从而删除无用的session文件。
所以,我们也可以采用这个思想,设置一个概率,让用户访问的时候,有概率地触发【删除“无动作”的用户】的操作。
具体代码实现:
创建数据库:test
创建数据库表:pre_online
session_id,activity_time
php代码:
<?php session_start(); header("Content-Type:text/html;charset=utf8"); date_default_timezone_set("UTC"); $conn = @mysql_connect("127.0.0.1","root","") or die("connect fail"); $db = mysql_select_db("test"); mysql_query("set names utf8"); $time = 20;//过期时间 $rand = rand(1,10);//生成1到10随机数,表示1/10的概率 /* 更新在线用户最后活动时间 */ $info_sql = mysql_query("select * from online where session_id="".session_id()."""); if(mysql_affected_rows()>0){ $sql = "UPDATE online set active_time=".time()." where session_id="".session_id()."""; }else{ $sql = "INSERT into online(session_id,active_time) VALUES("".session_id()."",".time().")"; } mysql_query($sql); /* 有概率地删除离线用户,类似于session的垃圾回收机制 */ if($rand==1){ mysql_query("DELETE FROM online WHERE active_time<".(time()-$time)); } ?>
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。