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教程 预定义变量
Oct 23 PHP
PHP开发环境配置(MySQL数据库安装图文教程)
Apr 28 PHP
基于PHP导出Excel的小经验 完美解决乱码问题
Jun 10 PHP
PHP中使用GD库创建圆形饼图的例子
Nov 19 PHP
php删除文本文件中重复行的方法
Apr 28 PHP
PHP实现无限级分类(不使用递归)
Oct 22 PHP
PHP中SSO Cookie登录分析和实现
Nov 06 PHP
使用PHP处理数据库数据如何将数据返回客户端并显示当前状态
Feb 16 PHP
PHP浮点数的一个常见问题
Mar 10 PHP
PHP文件类型检查及fileinfo模块安装使用详解
May 09 PHP
laravel实现简单用户权限的示例代码
May 28 PHP
laravel框架创建授权策略实例分析
Nov 22 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 不同编码下的字符串长度区分
2009/09/26 PHP
php中is_null,empty,isset,unset 的区别详细介绍
2013/04/28 PHP
PHP全局变量与超级全局变量区别分析
2016/04/01 PHP
PHP foreach遍历多维数组实现方式
2016/11/16 PHP
PHP实现时间比较和时间差计算的方法示例
2017/07/24 PHP
ThinkPHP3.2.3框架实现执行原生SQL语句的方法示例
2019/04/03 PHP
基于JQuery的数字改变的动画效果--可用来做计数器
2010/08/11 Javascript
JS的参数传递示例介绍
2014/02/08 Javascript
简单谈谈Javascript中类型的判断
2015/10/19 Javascript
详解AngularJS Filter(过滤器)用法
2015/12/28 Javascript
JS实现图片上传预览功能
2016/11/21 Javascript
深入理解vuex2.0 之 modules
2017/11/20 Javascript
Angular @HostBinding()和@HostListener()用法
2018/03/05 Javascript
微信小程序访问豆瓣电影api的实现方法
2019/03/31 Javascript
微信小程序 自定义弹窗实现过程(附代码)
2019/12/05 Javascript
vue过滤器实现日期格式化的案例分析
2020/07/02 Javascript
微信小程序中target和currentTarget的区别小结
2020/11/06 Javascript
[18:32]DOTA2 HEROS教学视频教你分分钟做大人-谜团
2014/06/12 DOTA
深入浅析Python的类
2018/06/22 Python
解决python "No module named pip" 的问题
2018/10/13 Python
Python Matplotlib库安装与基本作图示例
2019/01/09 Python
对DataFrame数据中的重复行,利用groupby累加合并的方法详解
2019/01/30 Python
django haystack实现全文检索的示例代码
2020/06/24 Python
用CSS3来实现社交分享按钮
2014/11/11 HTML / CSS
HTML5之SVG 2D入门1—SVG(可缩放矢量图形)概述
2013/01/30 HTML / CSS
一站式跨境收款解决方案:Payoneer(派安盈)
2018/09/06 全球购物
乌克兰鞋类购物网站:Eobuv.com.ua
2020/11/28 全球购物
《陈涉世家》教学反思
2014/04/12 职场文书
白血病捐款倡议书
2014/05/14 职场文书
合作协议书格式
2014/08/19 职场文书
2014年医德医风工作总结
2014/11/13 职场文书
2016大学生毕业实习心得体会
2016/01/23 职场文书
干货:如何写好工作总结报告!
2019/05/10 职场文书
详解CocosCreator消息分发机制
2021/04/16 Javascript
【海涛教你打DOTA】死灵飞龙第一视角解说
2022/04/01 DOTA
SpringCloud中分析讲解Feign组件添加请求头有哪些坑梳理
2022/06/21 Java/Android