晓夏

北漂的女孩

Good Luck To You!

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('该用户不在线。')}


神回复

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。