php 实现在线用户统计
浏览量:426
一,每次用户操作更新其在线时间
在用户表里加一个字段update_time,每次用户进行操作,都更新这个字段为当前时间 select count(*) from think_user where update_time>now()-10*60 优点:实现简单,通俗易懂 缺点:1,对“在线”的定义模糊,万一用户看一篇文章时间比较长,10分钟内没进行任何操作,他就被忽略了;2,如果user表数据量很大,那效率将极差
二,将在线用户单独放入一张表
新建一张表think_inline,字段有user_id、update_time,每次用户操作时,先判断表里有没有该用户的记录,没有则新增,有就更新update_time。 delete from think_inline where update_time
三,用JS定时器
这个方法是综合了一和二。新建一张表think_inline,也是在基类中定义每次用户操作时更新时间,参考二的做法。 不同之处是,在每个html模板里,加上一个js定时器,setInterval('updateTime', 10*3600);每隔10分钟发送一次ajax请求,更新update_time字段。这样,即使用户在一个页面停留时间过长,也不会被误认为不在线 了。并且可以通过减少请求的间隔,来增加精确度,当然了,对服务器的压力就更大了。 优点:对在线的判断较为准确 缺点:仍然不能既精确又不增加服务器压力,必须在两者之间进行取舍。
使用TP的SessionDb驱动进行最优化设计
这也就是网上有人说的session存入数据库的方法,这种方法优点很多。目前,LZ就是用的这个。具体做法是。。。
2,如何把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()函数,数据库里就会有记录。
3,利用数据库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('该用户不在线。')}
神回复
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。