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 相关文章推荐
ThinkPHP 防止表单重复提交的方法
Aug 08 PHP
Ajax实时验证用户名/邮箱等是否已经存在的代码打包
Dec 01 PHP
在PHP中设置、使用、删除Cookie的解决方法
May 06 PHP
探讨:array2xml和xml2array以及xml与array的互相转化
Jun 24 PHP
PHP获取和操作配置文件php.ini的几个函数介绍
Jun 24 PHP
php将HTML表格每行每列转为数组实现采集表格数据的方法
Apr 03 PHP
php中smarty模板条件判断用法实例
Jun 11 PHP
Yii使用migrate命令执行sql语句的方法
Mar 15 PHP
php-fpm添加service服务的例子
Apr 27 PHP
PHP针对redis常用操作实例详解
Aug 17 PHP
Yii框架中用response保存cookie,用request读取cookie的原理解析
Sep 04 PHP
Laravel 修改默认日志文件名称和位置的例子
Oct 17 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下防止单引号,双引号在接受页面转义的设置方法
2008/09/25 PHP
PHP 函数语法介绍一
2009/06/14 PHP
PHP中基本符号及使用方法
2010/03/23 PHP
鸡肋的PHP单例模式应用详解
2013/06/03 PHP
PHP提取字符串中的手机号正则表达式怎么写
2017/07/17 PHP
JS遮罩层效果 兼容ie firefox jQuery遮罩层
2010/07/26 Javascript
AJAX异步从优酷专辑中采集所有视频及信息(JavaScript代码)
2010/11/20 Javascript
eval与window.eval的差别分析
2011/03/17 Javascript
真正的JQuery.ajax传递中文参数的解决方法
2011/05/28 Javascript
jQuery动画animate方法使用介绍
2013/05/06 Javascript
js函数在frame中的相互调用详解
2014/03/03 Javascript
JS获取CSS样式(style/getComputedStyle/currentStyle)
2016/01/19 Javascript
JS制作图形验证码实现代码
2020/10/19 Javascript
基于vue2.0实现的级联选择器
2017/06/09 Javascript
webpack打包后直接访问页面图片路径错误的解决方法
2017/06/17 Javascript
jQuery实现的下雪动画效果示例【附源码下载】
2018/02/02 jQuery
关于AngularJS中ng-repeat不更新视图的解决方法
2018/09/30 Javascript
微信小程序实现左右列表联动
2020/05/19 Javascript
[02:25]DOTA2英雄基础教程 虚空假面
2014/01/02 DOTA
[01:34]DAC2018主赛事第四日五佳镜头 Gh巨牙海民助Miracle-死里逃生
2018/04/07 DOTA
利用python写个下载teahour音频的小脚本
2017/05/08 Python
python调用java的jar包方法
2018/12/15 Python
详解python中@的用法
2019/03/27 Python
python生成13位或16位时间戳以及反向解析时间戳的实例
2020/03/03 Python
Pytorch上下采样函数--interpolate用法
2020/07/07 Python
Python学习之time模块的基本使用
2021/01/17 Python
Office DEPOT法国官网:欧迪办公用品采购
2018/01/03 全球购物
美国领先的水果篮送货公司和新鲜水果供应商:The Fruit Company
2018/02/13 全球购物
台湾专柜女包:KINAZ
2019/12/26 全球购物
德国消费电子产品购物网站:Guter Kauf
2020/09/15 全球购物
法律专业推荐信范文
2013/11/29 职场文书
经理秘书求职自荐信范文
2014/03/23 职场文书
市场部业务员岗位职责
2014/04/02 职场文书
心灵捕手观后感
2015/06/02 职场文书
公共场所卫生管理制度
2015/08/05 职场文书
Python基础之数据结构详解
2021/04/28 Python