php实现用户在线时间统计详解


Posted in PHP onOctober 08, 2011

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

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 16 PHP
php检测图片木马多进制编程实践
Apr 11 PHP
PHP 自定义错误处理函数的使用详解
May 10 PHP
php curl的深入解析
Jun 02 PHP
让PHP显示Facebook的粉丝数量方法
Jan 08 PHP
主流PHP框架的优缺点对比分析
Dec 25 PHP
如何使用微信公众平台开发模式实现多客服
Jan 06 PHP
PHP实现简单实用的分页类代码
Apr 08 PHP
PHP快速推送微信模板消息
Apr 14 PHP
Laravel 实现密码重置功能
Feb 23 PHP
php intval函数用法总结
Apr 14 PHP
php统计数组不同元素的个数的实例方法
Sep 26 PHP
php 文件缓存函数
Oct 08 #PHP
php数字转汉字代码(算法)
Oct 08 #PHP
PHP判断远程url是否有效的几种方法小结
Oct 08 #PHP
php下利用curl判断远程文件是否存在的实现代码
Oct 08 #PHP
PHP下判断网址是否有效的代码
Oct 08 #PHP
Admin generator, filters and I18n
Oct 06 #PHP
如何在symfony中导出为CSV文件中的数据
Oct 06 #PHP
You might like
新安装的MySQL数据库需要注意的安全知识
2008/07/30 PHP
php中检查文件或目录是否存在的代码小结
2012/10/22 PHP
php设置session值和cookies的学习示例
2014/03/21 PHP
php实现给一张图片加上水印效果
2016/01/02 PHP
PHP数组去重比较快的实现方式
2016/01/19 PHP
PHP使用Redis长连接的方法详解
2018/02/12 PHP
laravel 验证错误信息到 blade模板的方法
2019/09/29 PHP
jquery 操作DOM案例代码分享
2012/04/05 Javascript
js生成的验证码的实现与技术分析
2014/09/17 Javascript
js实现类似jquery里animate动画效果的方法
2015/04/10 Javascript
使用AngularJS制作一个简单的RSS阅读器的教程
2015/06/18 Javascript
JS判断当前页面是否在微信浏览器打开的方法
2015/12/08 Javascript
html+js+highcharts绘制圆饼图表的简单实例
2016/08/04 Javascript
无循环 JavaScript(map、reduce、filter和find)
2017/04/08 Javascript
php简单数据库操作类的封装
2017/06/08 Javascript
vue中的非父子间的通讯问题简单的实例代码
2017/07/19 Javascript
Angular CLI 安装和使用教程
2017/09/13 Javascript
原生JS实现图片无缝滚动方法(附带封装的运动框架)
2017/10/01 Javascript
基于JavaScript实现表格滚动分页
2017/11/22 Javascript
浅谈vue项目优化之页面的按需加载(vue+webpack)
2017/12/11 Javascript
解决Jstree 选中父节点时被禁用的子节点也会选中的问题
2017/12/27 Javascript
jQuery实现点击图标div循环放大缩小功能
2018/09/30 jQuery
微信小程序实现评论功能
2018/11/28 Javascript
解决echarts的多个折现数据出现坐标和值对不上的问题
2018/12/28 Javascript
详解vue中使用transition和animation的实例代码
2020/12/12 Vue.js
[49:35]2018DOTA2亚洲邀请赛3月30日 小组赛A组 KG VS TNC
2018/03/31 DOTA
在pandas中一次性删除dataframe的多个列方法
2018/04/10 Python
Python中qutip用法示例详解
2020/10/02 Python
YSL圣罗兰美妆美国官网:Yves Saint Lauret US
2016/11/21 全球购物
美国潜水装备、水肺潜水和浮潜设备商店:Leisure Pro
2018/08/08 全球购物
巴黎卡诗加拿大官网:Kérastase加拿大
2018/11/12 全球购物
毕业生实习鉴定
2013/12/11 职场文书
酒店营销策划方案
2014/02/07 职场文书
高三上学期学习自我评价
2014/04/23 职场文书
教师节宣传方案
2014/05/23 职场文书
新教师教学工作总结
2015/08/12 职场文书