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.ini中文版
Oct 09 PHP
PHP 和 MySQL 基础教程(一)
Oct 09 PHP
PHP下MAIL的另一解决方案
Oct 09 PHP
php实现用户在线时间统计详解
Oct 08 PHP
php 搜索框提示(自动完成)实例代码
Feb 05 PHP
ThinkPHP之import方法实例详解
Jun 20 PHP
如何在旧的PHP系统中使用PHP 5.3之后的库
Dec 02 PHP
PHP 中 DOMDocument保存xml时中文出现乱码问题的解决方案
Sep 19 PHP
thinkphp跨库操作的简单代码实例
Sep 22 PHP
php实用代码片段整理
Nov 12 PHP
ThinkPHP框架表单验证操作方法
Jul 19 PHP
Laravel框架实现简单的学生信息管理平台案例
May 07 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多文件上传类实例
2015/03/07 PHP
php如何执行非缓冲查询API
2016/07/22 PHP
一个实用的php验证码类
2017/07/06 PHP
PHP多进程编程之僵尸进程问题的理解
2017/10/15 PHP
Javascript &amp; DHTML 实例编程(教程)(三)初级实例篇1—上传文件控件实例
2007/06/02 Javascript
jquery 简单导航实现代码
2009/09/11 Javascript
基于jquery的表格排序
2010/09/11 Javascript
js下将字符串当函数执行的方法
2011/07/13 Javascript
用Javascript评估用户输入密码的强度实现代码
2011/11/30 Javascript
JS与jQ读取xml文件的方法
2015/12/08 Javascript
Vue计算属性的使用
2017/08/04 Javascript
vue2 mint-ui loadmore实现下拉刷新,上拉更多功能
2018/03/21 Javascript
vue组件的写法汇总
2018/04/12 Javascript
JavaScript实现点击出现图片并统计点击次数功能示例
2018/07/23 Javascript
javascript异步处理与Jquery deferred对象用法总结
2019/06/04 jQuery
[38:32]DOTA2上海特级锦标赛A组资格赛#2 Secret VS EHOME第二局
2016/02/26 DOTA
[51:10]VP vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python 两个列表的差集、并集和交集实现代码
2016/09/21 Python
Python新手入门最容易犯的错误总结
2017/04/24 Python
详解Django之admin组件的使用和源码剖析
2018/05/04 Python
基于Python+QT的gui程序开发实现
2020/07/03 Python
django有哪些好处和优点
2020/09/01 Python
The Kooples美国官方网站:为情侣提供的法国当代时尚品牌
2019/01/03 全球购物
耐克亚太地区:Nike APAC
2019/12/07 全球购物
Linux管理员面试经常问道的相关命令
2013/04/29 面试题
中软国际Java程序员机试题
2012/08/19 面试题
护理个人求职信范文
2014/01/08 职场文书
接受捐赠答谢词
2014/01/27 职场文书
霸王洗发水广告词
2014/03/14 职场文书
幼儿园教师自我鉴定
2014/03/20 职场文书
企业安全生产责任书
2014/04/14 职场文书
2015年纪念“卢沟桥事变”78周年活动方案
2015/05/06 职场文书
Java输出Hello World完美过程解析
2021/06/13 Java/Android
CSS 使用 resize 实现图片拖拽切换预览功能(强大功能)
2021/08/23 HTML / CSS
使用Nginx的访问日志统计PV与UV
2022/05/06 Servers
设置IIS Express并发数
2022/07/07 Servers