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 相关文章推荐
BBS(php &amp; mysql)完整版(一)
Oct 09 PHP
php 将bmp图片转为jpg等其他任意格式的图片
Jun 29 PHP
php 获取本机外网/公网IP的代码
May 09 PHP
破解图片防盗链的代码(asp/php)测试通过
Jul 02 PHP
rrmdir php中递归删除目录及目录下的文件
May 15 PHP
解析php dirname()与__FILE__常量的应用
Jun 24 PHP
PHP 500报错的快速解决方法
Dec 14 PHP
php 基础函数
Feb 10 PHP
一个非常实用的php文件上传类
Jul 04 PHP
thinkPHP框架中layer.js的封装与使用方法示例
Jan 18 PHP
laravel 解决ajax异步提交数据,并还回填充表格的问题
Oct 15 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中addslashes与mysql_escape_string的区别分析
2016/04/25 PHP
PHP动态地创建属性和方法, 对象的复制, 对象的比较,加载指定的文件,自动加载类文件,命名空间
2016/05/06 PHP
如何用javascript控制上传文件的大小
2006/10/26 Javascript
jquery text(),val(),html()方法区别总结
2013/11/04 Javascript
Javascript判断图片尺寸大小实例分析
2014/06/16 Javascript
html、css和jquery相结合实现简单的进度条效果实例代码
2016/10/24 Javascript
实例解析jQuery中如何取消后续执行内容
2016/12/01 Javascript
关于Function中的bind()示例详解
2016/12/02 Javascript
Bootstrap源码解读模态弹出框(11)
2016/12/28 Javascript
node.js调用Chrome浏览器打开链接地址的方法
2017/05/17 Javascript
JavaScript 保护变量不被随意修改的实现代码
2017/09/27 Javascript
脚手架vue-cli工程webpack的基本用法详解
2018/09/29 Javascript
200行HTML+JavaScript实现年会抽奖程序
2019/01/22 Javascript
vue elementui el-form rules动态验证的实例代码详解
2019/05/23 Javascript
解决layer.msg 不居中 ifram中的问题
2019/09/05 Javascript
使用Python构建Hopfield网络的教程
2015/04/14 Python
python检查字符串是否是正确ISBN的方法
2015/07/11 Python
Django中对通过测试的用户进行限制访问的方法
2015/07/23 Python
详解python使用递归、尾递归、循环三种方式实现斐波那契数列
2018/01/16 Python
python邮件发送smtplib使用详解
2020/06/16 Python
Django为窗体加上防机器人的验证码功能过程解析
2019/08/14 Python
Django Serializer HiddenField隐藏字段实例
2020/03/31 Python
Keras中 ImageDataGenerator函数的参数用法
2020/07/03 Python
以设计师精品品质提供快速时尚:Mostata
2019/05/10 全球购物
Roxy俄罗斯官方网站:冲浪和滑雪板的一切
2020/06/20 全球购物
某个公司的Java笔面试题
2016/03/11 面试题
副厂长岗位职责
2014/02/02 职场文书
2014年药剂科工作总结
2014/11/26 职场文书
2015秋季幼儿园开学通知
2015/07/16 职场文书
毕业晚宴祝酒词
2015/08/11 职场文书
2019最新版试用期劳动合同模板!
2019/07/04 职场文书
56句经典英文座右铭
2019/08/09 职场文书
浅谈CSS不规则边框的生成方案
2021/05/25 HTML / CSS
JavaScript 与 TypeScript之间的联系
2021/11/27 Javascript
Windows server 2012 配置Telnet以及用法详解
2022/04/28 Servers
Python3使用Qt5来实现简易的五子棋小游戏
2022/05/02 Python