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 array_flip() 删除数组重复元素
Jan 14 PHP
getimagesize获取图片尺寸实例
Nov 15 PHP
微信公众平台消息接口校验与消息接口响应实例
Dec 23 PHP
php清除和销毁session的方法分析
Mar 19 PHP
PHP判断IP并转跳到相应城市分站的方法
Mar 25 PHP
php通过curl模拟登陆DZ论坛
May 11 PHP
php版微信公众平台入门教程之开发者认证的方法
Sep 26 PHP
php reset() 函数指针指向数组中的第一个元素并输出实例代码
Nov 21 PHP
完美解决thinkphp唯一索引重复时出错的问题
Mar 31 PHP
php-fpm中max_children的配置
Mar 15 PHP
PHP 7.4中使用预加载的方法详解
Jul 08 PHP
php中用unset销毁变量并释放内存
May 10 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多功能图片处理类分享(php图片缩放类)
2014/03/14 PHP
学习php设计模式 php实现原型模式(prototype)
2015/12/07 PHP
PHP多维数组转一维数组的简单实现方法
2015/12/23 PHP
PHP中Restful api 错误提示返回值实现思路
2016/04/12 PHP
PHP中获取文件创建日期、修改日期、访问时间的方法
2016/11/05 PHP
弹出广告特效(一个IP只弹出一次)的代码
2007/07/27 Javascript
JavaScript 监听textarea中按键事件
2009/10/08 Javascript
使用Mootools动态添加Css样式表代码,兼容各浏览器
2011/12/12 Javascript
javascript递归回溯法解八皇后问题
2015/04/22 Javascript
浅谈javascript语法和定时函数
2015/05/03 Javascript
Bootstrap每天必学之轮播(Carousel)插件
2016/04/25 Javascript
jQuery实现点击弹出背景变暗遮罩效果实例代码
2016/06/24 Javascript
Vue.js实现简单ToDoList 前期准备(一)
2016/12/01 Javascript
AngularJS之页面跳转Route实例代码
2017/03/10 Javascript
浅析bootstrap原理及优缺点
2017/03/19 Javascript
Vue from-validate 表单验证的示例代码
2017/09/26 Javascript
JS运动特效之链式运动分析
2018/01/24 Javascript
使用FormData实现上传多个文件
2018/12/04 Javascript
利用JS代码自动删除稿件的普通弹幕功能
2019/09/20 Javascript
简述Vue中容易被忽视的知识点
2019/12/09 Javascript
Angular单元测试之事件触发的实现
2020/01/20 Javascript
javascript设计模式 ? 策略模式原理与用法实例分析
2020/04/21 Javascript
详解Vue3 Composition API中的提取和重用逻辑
2020/04/29 Javascript
用Python代码来解图片迷宫的方法整理
2015/04/02 Python
关于Python中异常(Exception)的汇总
2017/01/18 Python
python利用有道翻译实现&quot;语言翻译器&quot;的功能实例
2017/11/14 Python
django输出html内容的实例
2018/05/27 Python
Python 3.6 中使用pdfminer解析pdf文件的实现
2019/09/25 Python
英国家庭和商业健身器材购物网站:Fitness Options
2018/07/05 全球购物
英语道歉信范文
2014/01/09 职场文书
护理人员的自我评价分享
2014/03/15 职场文书
大学学生会主席竞选稿
2015/11/19 职场文书
《所见》教学反思
2016/02/23 职场文书
企业管理制度设计时要注意的几种“常见病”!
2019/04/19 职场文书
当你找不到方向的时候,不妨读读刘备的一生
2019/08/05 职场文书
Springboot-cli 开发脚手架,权限认证,附demo演示
2022/04/28 Java/Android