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 相关文章推荐
php4的彩蛋
Oct 09 PHP
php db类库进行数据库操作
Mar 19 PHP
PHP中去掉字符串首尾空格的方法
May 19 PHP
使用PHP导出Redis数据到另一个Redis中的代码
Mar 12 PHP
PHP统计nginx访问日志中的搜索引擎抓取404链接页面路径
Jun 30 PHP
PHP获取音频文件的相关信息
Jun 22 PHP
php自定义分页类完整实例
Dec 25 PHP
PHP多维数组元素操作类的方法
Nov 14 PHP
PHP使用file_get_contents发送http请求功能简单示例
Apr 29 PHP
Yii2.0 RESTful API 基础配置教程详解
Dec 26 PHP
PHP如何将图片文件上传到另外一台服务器上
Aug 26 PHP
PHP程序员简单的开展服务治理架构操作详解(三)
May 14 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 db类库进行数据库操作
2009/03/19 PHP
PHP 加密与解密的斗争
2009/04/17 PHP
2014最热门的24个php类库汇总
2014/12/18 PHP
PHP获取某个月最大天数(最后一天)的方法
2015/07/29 PHP
PHP获取路径和目录的方法总结【必看篇】
2017/03/04 PHP
做网页的一些技巧(续)
2007/02/01 Javascript
用javascript实现的仿Flash广告图片轮换效果
2007/04/24 Javascript
JsDom 编程小结
2011/08/09 Javascript
淘宝网提供的国内NPM镜像简介和使用方法
2014/04/17 Javascript
js数组操作常用方法
2014/05/08 Javascript
js点击列表文字对应该行显示背景颜色的实现代码
2015/08/05 Javascript
jQuery基于BootStrap样式实现无限极地区联动
2016/08/26 Javascript
深入理解Angularjs中$http.post与$.post
2017/05/19 Javascript
BootStrap下的弹出框加载select2框架失败的解决方法
2017/08/31 Javascript
深入剖析Express cookie-parser中间件实现示例
2018/02/01 Javascript
如何用webpack4带你实现一个vue的打包的项目
2018/06/20 Javascript
微信公众平台 发送模板消息(Java接口开发)
2019/04/17 Javascript
微信小程序实用代码段(收藏版)
2019/12/17 Javascript
leaflet加载geojson叠加显示功能代码
2020/02/21 Javascript
JQuery表单元素取值赋值方法总结
2020/05/12 jQuery
vue实现公共方法抽离
2020/07/31 Javascript
Python中的filter()函数的用法
2015/04/27 Python
Python利用sqlacodegen自动生成ORM实体类示例
2019/06/04 Python
Django ModelForm操作及验证方式
2020/03/30 Python
使用matlab 判断两个矩阵是否相等的实例
2020/05/11 Python
python利用opencv保存、播放视频
2020/11/02 Python
Python可以用来做什么
2020/11/23 Python
Static Nested Class 和 Inner Class的不同
2013/11/28 面试题
UNIX文件系统常用命令
2012/05/25 面试题
工作自我评价怎么写
2014/01/29 职场文书
学生操行评语大全
2014/04/24 职场文书
学生会竞选演讲稿纪检部
2014/08/25 职场文书
导游词之阆中古城
2019/12/23 职场文书
python基础学习之递归函数知识总结
2021/05/26 Python
详细介绍Java中的CyclicBarrier
2022/04/13 Java/Android
JS前端轻量fabric.js系列物体基类
2022/08/05 Javascript