php下统计用户在线时间的一种尝试


Posted in PHP onAugust 26, 2010

下面列出几个比较常用的方法:

首先介绍一下所涉及的数据表结构,四个字段:

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 相关文章推荐
给多个地址发邮件的类
Oct 09 PHP
基于mysql的论坛(3)
Oct 09 PHP
配置Apache2.2+PHP5+CakePHP1.2+MySQL5运行环境
Apr 25 PHP
php ignore_user_abort与register_shutdown_function 使用方法
Jun 14 PHP
php array_walk() 数组函数
Jul 12 PHP
php安全开发 添加随机字符串验证,防止伪造跨站请求
Feb 14 PHP
PHP缓存机制Output Control详解
Jul 14 PHP
从零开始学YII2框架(五)快速生成代码工具 Gii 的使用
Aug 20 PHP
PHP防止注入攻击实例分析
Nov 03 PHP
基于PHP给大家讲解防刷票的一些技巧
Nov 18 PHP
PHP实现通过URL提取根域名
Mar 31 PHP
php+mysql开发的最简单在线题库(在线做题系统)完整案例
Mar 30 PHP
PHP生成excel时单元格内换行问题的解决方法
Aug 26 #PHP
PHP下对字符串的递增运算代码
Aug 21 #PHP
深入理解PHP原理之异常机制
Aug 21 #PHP
php中var_export与var_dump的区别分析
Aug 21 #PHP
php visitFile()遍历指定文件夹函数
Aug 21 #PHP
php excel类 phpExcel使用方法介绍
Aug 21 #PHP
php下正则来匹配dede模板标签的代码
Aug 21 #PHP
You might like
php生成EXCEL的东东
2006/10/09 PHP
PHP编程中八种常见的文件操作方式
2006/11/19 PHP
Apache环境下PHP利用HTTP缓存协议原理解析及应用分析
2010/02/16 PHP
php中显示数组与对象的实现代码
2011/04/18 PHP
php数组函数序列之in_array() - 查找数组中是否存在指定值
2011/11/07 PHP
PHP实现生成唯一编号(36进制的不重复编号)
2014/07/01 PHP
php微信公众平台开发之微信群发信息
2016/09/13 PHP
自制PHP框架之路由与控制器
2017/05/07 PHP
php微信公众号开发之校园图书馆
2018/10/20 PHP
JS HTML5 音乐天气播放器(Ajax获取天气信息)
2013/05/26 Javascript
JavaScript中指定函数名称的相关方法
2015/06/04 Javascript
关于javascript事件响应的基础语法总结(必看篇)
2016/12/26 Javascript
vue使用axios跨域请求数据问题详解
2017/10/18 Javascript
Vue2.0 事件的广播与接收(观察者模式)
2018/03/14 Javascript
JS实现将二维数组转为json格式字符串操作示例
2018/07/12 Javascript
详解Angular6 热加载配置方案
2018/08/18 Javascript
vue中promise的使用及异步请求数据的方法
2018/11/08 Javascript
微信小程序仿知乎实现评论留言功能
2018/11/28 Javascript
vue实现设置载入动画和初始化页面动画效果
2019/10/28 Javascript
Preload基础使用方法详解
2020/02/03 Javascript
编写Python CGI脚本的教程
2015/06/29 Python
Python中列表和元组的相关语句和方法讲解
2015/08/20 Python
八大排序算法的Python实现
2021/01/28 Python
python处理DICOM并计算三维模型体积
2019/02/26 Python
解决Keras中Embedding层masking与Concatenate层不可调和的问题
2020/06/18 Python
如何利用python发送邮件
2020/09/26 Python
德国亚洲食品网上商店:asiafoodland.de
2019/12/28 全球购物
电气专业推荐信范文
2013/11/18 职场文书
实习鉴定范文
2013/12/19 职场文书
《草虫的村落》教学反思
2014/02/16 职场文书
2015试用期转正工作总结
2014/12/12 职场文书
生产车间主任岗位职责
2015/04/08 职场文书
2015年普法依法治理工作总结
2015/05/26 职场文书
人生一定要学会的三样东西:放下、忘记、珍惜
2019/08/21 职场文书
background-position百分比原理详解
2021/05/08 HTML / CSS
基于Python实现将列表数据生成折线图
2022/03/23 Python