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));
}
?>声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
