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 相关文章推荐
超级好用的一个php上传图片类(随机名,缩略图,加水印)
Jun 30 PHP
php下通过伪造http头破解防盗链的代码
Jul 03 PHP
md5 16位二进制与32位字符串相互转换示例
Dec 30 PHP
PHP下获取上个月、下个月、本月的日期(strtotime,date)
Feb 02 PHP
thinkphp学习笔记之多表查询
Jul 28 PHP
WordPress中用于获取文章作者与分类信息的方法整理
Dec 17 PHP
PHP的Laravel框架结合MySQL与Redis数据库的使用部署
Mar 21 PHP
php将一维数组转换为每3个连续值组成的二维数组
May 06 PHP
PHP使用GD库输出汉字的方法【测试可用】
Nov 10 PHP
PHP自动补全表单的两种方法
Mar 06 PHP
thinkPHP5.1框架路由::get、post请求简单用法示例
May 06 PHP
PHP实现考试倒计时功能代码
Apr 16 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程序员应该了解MongoDB的五件事
2013/06/03 PHP
Thinkphp中Create方法深入探究
2014/06/16 PHP
详解PHP导入导出CSV文件
2014/11/03 PHP
PHP目录与文件操作技巧总结(创建,删除,遍历,读写,修改等)
2016/09/11 PHP
PHP延迟静态绑定的深入讲解
2018/04/02 PHP
Javascript 的addEventListener()及attachEvent()区别分析
2009/05/21 Javascript
javascript KeyDown、KeyPress和KeyUp事件的区别与联系
2009/12/03 Javascript
在javaScript中关于submit和button的区别介绍
2013/10/20 Javascript
js实现俄罗斯方块小游戏分享
2014/01/31 Javascript
js获取上传文件大小示例代码
2014/04/10 Javascript
JS辨别访问浏览器判断是android还是ios系统
2014/08/19 Javascript
JS实现黑客帝国文字下落效果
2015/09/01 Javascript
老生常谈javascript的类型转换
2016/10/12 Javascript
jQuery插件echarts实现的多柱子柱状图效果示例【附demo源码下载】
2017/03/04 Javascript
JS实现简易刻度时钟示例代码
2017/03/11 Javascript
Node.js中的http请求客户端示例(request client)
2017/05/04 Javascript
JavaScript实现设置默认日期范围为最近40天的方法分析
2017/07/12 Javascript
详解vue 模拟后台数据(加载本地json文件)调试
2017/08/25 Javascript
JS在if中的强制类型转换方式
2018/07/15 Javascript
layui实现点击按钮给table添加一行
2018/08/10 Javascript
更改BootStrap popover的默认样式及popover简单用法
2018/09/13 Javascript
vue开发中遇到的问题总结
2020/04/07 Javascript
探究一道价值25k的蚂蚁金服异步串行面试题
2020/08/21 Javascript
解决Scrapy安装错误:Microsoft Visual C++ 14.0 is required...
2017/10/01 Python
python 移动图片到另外一个文件夹的实例
2019/01/10 Python
解决python线程卡死的问题
2019/02/18 Python
python实现控制电脑鼠标和键盘,登录QQ的方法示例
2019/07/06 Python
让IE支持CSS3的不完全兼容方案
2014/09/19 HTML / CSS
欧洲最大的拼图游戏商店:JigsawPuzzle.co.uk
2018/07/04 全球购物
教师演讲稿范文
2014/01/08 职场文书
好矿嫂事迹材料
2014/01/21 职场文书
三下乡活动方案
2014/01/31 职场文书
毕业生如何写自荐信
2014/03/26 职场文书
代领毕业证委托书
2014/08/02 职场文书
奥巴马经典演讲稿
2014/09/13 职场文书
mysql聚集索引、辅助索引、覆盖索引、联合索引的使用
2022/02/12 MySQL