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下使用无限生命期Session的方法
Mar 16 PHP
PHP中数组的三种排序方法分享
May 07 PHP
PHP utf-8编码问题,utf8编码,数据库乱码,页面显示输出乱码
Apr 08 PHP
dhtmlxTree目录树增加右键菜单以及拖拽排序的实现方法
Apr 26 PHP
Laravel框架学习笔记(二)项目实战之模型(Models)
Oct 15 PHP
PHP实现WebService的简单示例和实现步骤
Mar 27 PHP
jQuery获取json后使用zy_tmpl生成下拉菜单
Mar 27 PHP
php页面跳转session cookie丢失导致不能登录等问题的解决方法
Dec 12 PHP
php处理抢购类功能的高并发请求
Feb 08 PHP
浅析php如何实现爬取数据原理
Sep 27 PHP
laravel 中某一字段自增、自减的例子
Oct 11 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
Mar 30 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常用技巧总结(附函数代码)
2012/02/04 PHP
ThinkPHP验证码使用简明教程
2014/03/05 PHP
PHP实现模仿socket请求返回页面的方法
2014/11/04 PHP
老版本PHP转义Json里的特殊字符的函数
2015/06/08 PHP
浅析PHP中call user func()函数及如何使用call user func调用自定义函数
2015/11/05 PHP
Laravel框架模型的创建及模型对数据操作示例
2019/05/07 PHP
新手常遇到的一些jquery问题整理
2010/08/16 Javascript
Javascript面向对象编程(二) 构造函数的继承
2011/08/28 Javascript
JavaScript中“基本类型”之争小结
2013/01/03 Javascript
js实现数组去重、判断数组以及对象中的内容是否相同
2013/11/29 Javascript
javascript元素动态创建实现方法
2015/05/13 Javascript
纯JavaScript代码实现移动设备绘图解锁
2015/10/16 Javascript
JS JSOP跨域请求实例详解
2016/07/04 Javascript
jQuery实现邮箱下拉列表自动补全功能
2016/09/08 Javascript
微信小程序“摇一摇”的实例代码
2017/07/20 Javascript
详解Vue.js组件可复用性的混合(mixin)方式和自定义指令
2017/09/06 Javascript
vue用Object.defineProperty手写一个简单的双向绑定的示例
2018/07/09 Javascript
如何安装控制器JavaScript生成插件详解
2018/10/21 Javascript
JS实现数组去重及数组内对象去重功能示例
2019/02/02 Javascript
简单谈谈javascript高级特性
2019/09/04 Javascript
js获取url页面id,也就是最后的数字文件名
2020/09/25 Javascript
详解python中requirements.txt的一切
2017/03/03 Python
浅析python参数的知识点
2018/12/10 Python
python交互界面的退出方法
2019/02/16 Python
Tensorflow:转置函数 transpose的使用详解
2020/02/11 Python
FC-Moto西班牙:摩托车手最大的购物场所之一
2019/04/11 全球购物
值传递还是引用传递
2015/02/08 面试题
2014年入党积极分子党课学习心得体会模板
2014/04/03 职场文书
乡镇个人对照检查材料
2014/08/22 职场文书
验房委托书
2014/08/30 职场文书
试用期自我评价范文
2015/03/10 职场文书
党员干部学法用法心得体会
2016/01/21 职场文书
小学音乐课歌曲《堆雪人》教学反思
2016/02/18 职场文书
MySQL基础(二)
2021/04/05 MySQL
Go语言实现一个简单的并发聊天室的项目实战
2022/03/18 Golang
Golang并发工具Singleflight
2022/05/06 Golang