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 相关文章推荐
ob_start(),ob_start('ob_gzhandler')使用
Dec 25 PHP
php下实现伪 url 的超简单方法[转]
Sep 24 PHP
php 文件状态缓存带来的问题
Dec 14 PHP
Ajax PHP 边学边练 之三 数据库
Nov 26 PHP
php中使用临时表查询数据的一个例子
Feb 03 PHP
Linux系统中设置多版本PHP共存配合Nginx服务器使用
Dec 21 PHP
Zend Framework教程之模型Model基本规则和使用方法
Mar 04 PHP
一段实用的php验证码函数
May 19 PHP
php中请求url的五种方法总结
Jul 13 PHP
浅谈PHP发送HTTP请求的几种方式
Jul 25 PHP
Laravel-添加后台模板AdminLte的实现方法
Oct 08 PHP
laravel 实现根据字段不同值做不同查询
Oct 23 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
CI框架源码阅读,系统常量文件constants.php的配置
2013/02/28 PHP
php+mysqli使用面向对象方式更新数据库实例
2015/01/29 PHP
PHP中phar包的使用教程
2017/06/14 PHP
laravel5.1框架基础之Blade模板继承简单使用方法分析
2019/09/05 PHP
新手常遇到的一些jquery问题整理
2010/08/16 Javascript
JavaScript小技巧 2.5 则
2010/09/12 Javascript
JS拖动技术 关于setCapture使用
2010/12/09 Javascript
JS按位非(~)运算符与~~运算符的理解分析
2011/07/31 Javascript
jquery利用ajax调用后台方法实例
2013/08/23 Javascript
JS判断对象是否存在的10种方法总结
2013/12/23 Javascript
jQuery提示效果代码分享
2014/11/20 Javascript
AngularJS入门教程(二):AngularJS模板
2014/12/06 Javascript
jquery获取input type=text中的值的各种方式(总结)
2016/12/02 Javascript
vue.js获取数据库数据实例代码
2017/05/26 Javascript
vue路由对不同界面进行传参及跳转的总结
2019/04/20 Javascript
Bootstrap FileInput实现图片上传功能
2021/01/28 Javascript
基于Python的身份证号码自动生成程序
2014/08/15 Python
Python如何实现文本转语音
2016/08/08 Python
Python类的动态修改的实例方法
2017/03/24 Python
Django 使用Ajax进行前后台交互的示例讲解
2018/05/28 Python
Python中的单行、多行、中文注释方法
2018/07/19 Python
在Python中将函数作为另一个函数的参数传入并调用的方法
2019/01/22 Python
Django单元测试工具test client使用详解
2019/08/02 Python
ffmpeg+Python实现B站MP4格式音频与视频的合并示例代码
2020/10/21 Python
Python 实现PS滤镜中的径向模糊特效
2020/12/03 Python
秘鲁购物网站:Linio秘鲁
2017/04/07 全球购物
应聘教师自荐信
2013/10/12 职场文书
车间组长岗位职责
2013/12/20 职场文书
《花瓣飘香》教学反思
2014/04/15 职场文书
软件项目实施计划书
2014/05/02 职场文书
领导干部作风建设自查报告
2014/10/23 职场文书
死亡赔偿协议书
2015/01/28 职场文书
公司2015年终工作总结
2015/05/26 职场文书
pytorch 实现变分自动编码器的操作
2021/05/24 Python
python opencv检测直线 cv2.HoughLinesP的实现
2021/06/18 Python
MySQL系列之五 视图、存储函数、存储过程、触发器
2021/07/02 MySQL