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中DOMElement操作xml文档实例演示
Mar 26 PHP
php时间戳转换的示例
Mar 31 PHP
PHP mkdir()无写权限的问题解决方法
Jun 19 PHP
学习php中的正则表达式
Aug 17 PHP
ThinkPHP框架设计及扩展详解
Nov 25 PHP
php+jQuery.uploadify实现文件上传教程
Dec 26 PHP
Laravel中使用阿里云OSS Composer包分享
Feb 10 PHP
PHP实现获取第一个中文首字母并进行排序的方法
May 09 PHP
PHP设计模式之装饰器模式实例详解
Feb 07 PHP
php如何利用pecl安装mongodb扩展详解
Jan 09 PHP
PHP 计算两个时间段之间交集的天数示例
Oct 24 PHP
laravel框架select2多选插件初始化默认选中项操作示例
Feb 18 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
PHP在不同页面间传递Json数据示例代码
2013/06/08 PHP
PHP提示Cannot modify header information - headers already sent by解决方法
2014/09/22 PHP
PHP处理Oracle的CLOB实例
2014/11/03 PHP
Yii2框架实现登录、退出及自动登录功能的方法详解
2017/10/24 PHP
ThinkPHP防止重复提交表单的方法实例分析
2018/05/10 PHP
统计PHP目录中的文件数方法
2019/03/05 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
2019/12/30 PHP
JQuery 学习笔记 选择器之五
2009/07/23 Javascript
jquery加载页面的方法(页面加载完成就执行)
2011/06/21 Javascript
JS下拉缓冲菜单示例代码
2013/08/30 Javascript
如何让DIV可编辑、可拖动示例代码
2013/09/18 Javascript
让jQuery与其他JavaScript库并存避免冲突的方法
2013/12/23 Javascript
JS实现带有3D立体感的银灰色竖排折叠菜单代码
2015/10/20 Javascript
JavaScript设计模式之缓存代理模式原理与简单用法示例
2018/08/07 Javascript
JavaScript常见继承模式实例小结
2019/01/11 Javascript
怎样使你的 JavaScript 代码简单易读(推荐)
2019/04/16 Javascript
vue实现导航标题栏随页面滚动渐隐渐显效果
2020/03/12 Javascript
自己使用总结Python程序代码片段
2015/06/02 Python
详解Django中的权限和组以及消息
2015/07/23 Python
Python使用面向对象方式创建线程实现12306售票系统
2015/12/24 Python
Python实现将一个大文件按段落分隔为多个小文件的简单操作方法
2017/04/17 Python
Python面向对象之继承和组合用法实例分析
2018/08/27 Python
对pandas读取中文unicode的csv和添加行标题的方法详解
2018/12/12 Python
python计算波峰波谷值的方法(极值点)
2020/02/18 Python
PyCharm中关于安装第三方包的三个建议
2020/09/17 Python
学点简单的Django之第一个Django程序的实现
2021/02/24 Python
英国评分最高的女性剃须刀订阅盒:FFS Beauty
2018/01/25 全球购物
EJB的基本架构
2016/09/22 面试题
园林施工员岗位职责
2013/12/11 职场文书
2014年大学生自我评价
2014/01/19 职场文书
教育科研先进个人材料
2014/01/26 职场文书
餐饮收银员岗位职责
2014/02/07 职场文书
清明节演讲稿
2014/05/27 职场文书
省级优秀毕业生主要事迹
2014/05/29 职场文书
2014年小学数学教师工作总结
2014/12/03 职场文书
2015年办公室主任工作总结
2015/04/09 职场文书