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 相关文章推荐
php 正则匹配函数体
Aug 25 PHP
Thinkphp模板中使用自定义函数的方法
Sep 23 PHP
thinkphp3.0 模板中函数的使用
Nov 13 PHP
php.ini 配置文件的深入解析
Jun 17 PHP
生成随机字符串和验证码的类的PHP实例
Dec 24 PHP
MyEclipse常用配置图文教程
Sep 11 PHP
php表单提交与$_POST实例分析
Jan 26 PHP
Yii中CGridView禁止列排序的设置方法
Jul 12 PHP
php常用数组函数实例小结
Dec 29 PHP
PHP利用二叉堆实现TopK-算法的方法详解
Apr 24 PHP
针对PHP开发安全问题的相关总结
Mar 22 PHP
php传值和传引用的区别点总结
Nov 19 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中去除换行解决办法小结(PHP_EOL)
2011/11/27 PHP
邮箱正则表达式实现代码(针对php)
2013/06/21 PHP
PHP入门教程之面向对象基本概念实例分析
2016/09/11 PHP
Laravel 中使用 Vue.js 实现基于 Ajax 的表单提交错误验证操作
2017/06/30 PHP
关于Javascript 的 prototype问题。
2007/01/03 Javascript
当jQuery1.7遇上focus方法的问题
2014/01/26 Javascript
Jquery中国地图热点效果-鼠标经过弹出提示层信息的简单实例
2014/02/12 Javascript
jquery 实现滚动条下拉时无限加载的简单实例
2016/06/01 Javascript
基于Vue2的移动端开发环境搭建详解
2016/11/03 Javascript
利用vue实现模态框组件
2016/12/19 Javascript
详解如何优雅地在React项目中使用Redux
2017/12/28 Javascript
在vue中使用SockJS实现webSocket通信的过程
2018/08/29 Javascript
微信小程序解除10个请求并发限制
2018/12/18 Javascript
小程序测试后台服务的方法(ngrok)
2019/03/08 Javascript
react写一个select组件的实现代码
2019/04/03 Javascript
微信小程序导入Vant报错VM292:1 thirdScriptError的解决方法
2019/08/01 Javascript
js prototype深入理解及应用实例分析
2019/11/25 Javascript
ant design实现圈选功能
2019/12/17 Javascript
[01:04:01]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第一场
2014/05/24 DOTA
[05:28]刀塔密之一:团结则存
2014/07/03 DOTA
[08:40]Navi Vs Newbee
2018/06/07 DOTA
Python实现以时间换空间的缓存替换算法
2016/02/19 Python
python3获取两个日期之间所有日期,以及比较大小的实例
2018/04/08 Python
python 给DataFrame增加index行名和columns列名的实现方法
2018/06/08 Python
python yield和Generator函数用法详解
2020/02/10 Python
如何在mac下配置python虚拟环境
2020/07/06 Python
Python 解析简单的XML数据
2020/07/24 Python
HTML5+Canvas+CSS3实现齐天大圣孙悟空腾云驾雾效果
2016/04/26 HTML / CSS
后勤主管工作职责
2013/12/07 职场文书
我的大学四年规划书范文2014
2014/09/26 职场文书
2014年体育部工作总结
2014/11/13 职场文书
学年个人总结范文
2015/03/05 职场文书
重温入党誓词主持词
2015/06/29 职场文书
婚礼上证婚人致辞
2015/07/28 职场文书
电工生产实习心得体会
2016/01/22 职场文书
十大必看国产动漫排名,魁拔上线,第二曾在日本播出
2022/03/18 国漫