php下统计用户在线时间的一种尝试


Posted in PHP onAugust 26, 2010

下面列出几个比较常用的方法:

首先介绍一下所涉及的数据表结构,四个字段:

uid<int(10)> :用户id 
session_id<varchar(40)> :用户登录后系统产生的session_id,PHP可是使用session_id()函数获取 
login_time<int(10)> :登录时间 
logout_time<int(10)> :登出时间

1. 客户端定时发送请求到服务器端。实现方法是在用户登录后,将uid,session_id,login_time插入一条记录,然后在客户端js设定一个计时器,比如每10分钟向服务器端发送一个请求,以此来达到更新登出时间的目的,当然这个间隔时间设定的越短,数据可能会越准确,不过相应的系统的负载也会越高,这个可以根据实际情况设定一个合适的值。这种方法广泛应用于webgame上,因为webgame的几乎所有请求都是ajax请求,不用刷新页面,一旦刷新页面,这个计时器就失去了价值,这也是这个方法的局限性。
2. 服务器设定一个定时轮询的脚本。这个方法是在服务器端写一个定时执行的脚本,比如5分钟执行一次,根据数据库中的记录来判断每个会话的session_id是否还存在于服务器上,如果存在就更新logout_time,不存在就跳过。这样也能比较准确的统计在线时间,不过缺点是需要有服务器的控制权,不然无法设定定时脚本,linux系统可以通过crontab实现,windows系统可以通过计划任务来完成。如果你只是买的虚拟主机,那么这个方法也同样不适合你。
3. 在用户每次活动时更新一下登出时间。这样在用户不活动或者退出的时候,登出时间就自然而然的存在于数据库里了,这也是本文着重讨论的方案。下面给出实现方法。
首先,在用户登录成功后,记录下其uid,session_id,并将现在时间作为登陆时间,现在时间+600s作为登出时间,插入数据库。
$uid = $_SESSION['uid'] = $info['id']; 
$session_id = $_SESSION['session_id'] = session_id(); 
$login_time = time(); 
$logout_time = time()+600; 
$sql = "INSERT INTO member_login (uid,session_id,login_time,logout_time) values($uid,'$session_id',$login_time,$logout_time)"; 
mysql_query($sql);

然后在用户每次活动,也就是每点击一个页面时,如果session存在也就是处于登录状态时,更新用户登出时间
if($_SESSION['uid']){ 
$uid = $_SESSION['uid']; 
$session_id = $_SESSION['session_id']; 
$logout_time = time()+600; 
$sql = "UPDATE member_login SET logout_time=$logout_time WHERE uid=$uid AND session_id='$session_id'"; 
mysql_query($sql); 
}

这种方法的优点是相对来说实现起来比较简单,能够适用于大多数的网站,没有额外的服务器需求,而且也可以比较准确的统计用户的在线时间。
缺点也很明显,增加了数据库的更新操作,增加了系统的负载,不过对于中小型网站来说应该不是问题。
PHP 相关文章推荐
新浪新闻小偷
Oct 09 PHP
php imagecreatetruecolor 创建高清和透明图片代码小结
May 15 PHP
PHP正确配置mysql(apache环境)
Aug 28 PHP
PHP中其实也可以用方法链
Nov 10 PHP
php摘要生成函数(无乱码)
Feb 04 PHP
基于php设计模式中工厂模式详细介绍
May 15 PHP
基于php常用函数总结(数组,字符串,时间,文件操作)
Jun 27 PHP
Web程序工作原理详解
Dec 25 PHP
在Debian系统下配置LNMP的教程
Jul 09 PHP
PHP实现活动人选抽奖功能
Apr 19 PHP
Laravel框架使用Redis的方法详解
May 30 PHP
laravel 根据不同组织加载不同视图的实现
Oct 14 PHP
PHP生成excel时单元格内换行问题的解决方法
Aug 26 #PHP
PHP下对字符串的递增运算代码
Aug 21 #PHP
深入理解PHP原理之异常机制
Aug 21 #PHP
php中var_export与var_dump的区别分析
Aug 21 #PHP
php visitFile()遍历指定文件夹函数
Aug 21 #PHP
php excel类 phpExcel使用方法介绍
Aug 21 #PHP
php下正则来匹配dede模板标签的代码
Aug 21 #PHP
You might like
PHP 冒泡排序算法的实现代码
2010/08/08 PHP
PHP聚合式迭代器接口IteratorAggregate用法分析
2017/12/28 PHP
JS类的封装及实现代码
2009/12/02 Javascript
JavaScript QueryString解析类代码
2010/01/17 Javascript
jQuery:delegate中select()不起作用的解决方法(实例讲解)
2014/01/26 Javascript
Jquery Ajax解析XML数据(同步及异步调用)简单实例
2014/02/12 Javascript
Node.js的包详细介绍
2015/01/14 Javascript
JavaScript通过prototype给对象定义属性用法实例
2015/03/23 Javascript
javascript中Function类型详解
2015/04/28 Javascript
javascript基本数据类型及类型检测常用方法小结
2016/12/14 Javascript
Javascript实现一个简单的输入关键字添加标签效果实例
2017/06/01 Javascript
Ionic3实现图片瀑布流布局
2017/08/09 Javascript
浅谈JS获取元素的N种方法及其动静态讨论
2017/08/25 Javascript
原生js中ajax访问的实例详解
2017/09/19 Javascript
Vue基于NUXT的SSR详解
2017/10/24 Javascript
nodejs实现套接字服务功能详解
2018/06/21 NodeJs
解决微信小程序中的滚动穿透问题
2019/09/16 Javascript
es6数组之扩展运算符操作实例分析
2020/04/25 Javascript
Electron整合React使用搭建开发环境的步骤详解
2020/06/07 Javascript
Vue-cli4 配置 element-ui 按需引入操作
2020/09/11 Javascript
微信小程序自定义modal弹窗组件的方法详解
2020/12/20 Javascript
[01:00:04]DOTA2上海特级锦标赛B组小组赛#1 Alliance VS Spirit第二局
2016/02/26 DOTA
[49:08]FNATIC vs Infamous 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
python插入数据到列表的方法
2015/04/30 Python
利用Python开发微信支付的注意事项
2016/08/19 Python
python数据持久存储 pickle模块的基本使用方法解析
2019/08/30 Python
pycharm快捷键汇总
2020/02/14 Python
基于python实现可视化生成二维码工具
2020/07/08 Python
Python+OpenCV检测灯光亮点的实现方法
2020/11/02 Python
委托公证书范本
2014/04/03 职场文书
浅谈Golang 切片(slice)扩容机制的原理
2021/06/09 Golang
如何解决springcloud feign 首次调用100%失败的问题
2021/06/23 Java/Android
gateway网关接口请求的校验方式
2021/07/15 Java/Android
方法汇总:Python 安装第三方库常用
2022/04/26 Python
Django框架中表单的用法
2022/06/10 Python
PostgreSQL逻辑复制解密原理解析
2022/09/23 PostgreSQL