PHP用户在线统计方法四

分享
已结 精华 置顶
1 80
chichu
chichu 2021-09-16
其实,在thinkphp中,我们可以使用使用其SessionDb驱动进行用户在线统计。

session是存储在服务器的临时数据,服务器默认将session以文件的方式保存在硬盘上的。在关闭浏览器后,服务器会有session回收机制,自动删除过期session。

session具有唯一性、方便调用、不会过多占用资源的优点。

由于每个客户端会产生唯一的session_id,不会混肴,所以我们在做用户登录时,会将用户数据存入session。这样,在任何页面都可以非常方便的调用session数据。

而统计在线用户人数就是通过统计有多少条session记录来实现的。

但是,操作数据库要比读文件方便的多,并且可以对session数据进行各种操作。

TP的SessionDb驱动就实现了这个功能。原理就是通过改写PHP默认的session操作来实现,核心函数session_set_save_handler(),有兴趣的可以研究一下。该驱动将session的增、读、取、和删都放入了数据库。

统计在线用户人数:

1,建表,驱动的注释里的sql语句运行下就好

2,添加配置:

//Session配置
'SESSION_TYPE'            => 'db',            //数据库存储session
'SESSION_TABLE'            => 'think_session',    //存session的表
'SESSION_EXPIRE'        => 600,                //session过期时间
这样,只要我们在程序里使用了session()函数,数据库里就会有记录。

1,统计在线总人数
$map = array('session_expire'=>array('gt',NOW_TIME));
$inline = D('Session')->where($map)->count();
2,统计游客(未登录)人数
$map = array('session_expire'=>array('gt',NOW_TIME),'session_data'=>array('eq',''));
$huiyuan = D('Session')->where($map)->count();
3,统计会员(已登录)人数
$map = array('session_expire'=>array('gt',NOW_TIME),'session_data'=>array('neq',''));
$huiyuan = D('Session')->where($map)->count();
4,判断一个用户是否在线。
在用户表里新增一个字段:session_id。
(1)在登录操作里,保存该用户的session_id,
$session_id = session_id();
D('User')->where(array('id'=>$user_id))->save('session_id'=>$session_id);
(2)检查session表里是否存在该session_id,未过期并且有值,
$map = array('session_id'=>$session_id,'session_expire'=>array('gt',NOW_TIME),'session_data'=>array('neq',''));
 $res = D('Session')->where($map)->find();
if($res){
    dump('该用户在线。');
}else{
    dump('该用户不在线。');
}
优点:
(1)对数据库和服务器的压力都小,操作简单
(2)能够区分在线用户是会员还是游客(session_data字段是否有值)
(3)可以通过删除某用户的session记录,实现将其“踢下线”的功能

缺点:
(1)仍然不能精确统计,只能说,XX秒内在线多少人

上一篇:后台内容无法编辑和添加

下一篇:PHP用户在线统计方法三

回帖
取消评论