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水印
Mar 16 PHP
PHP Google的translate API代码
Dec 10 PHP
检查url链接是否已经有参数的php代码 添加 ? 或 &amp;
Feb 09 PHP
php中CI操作多个数据库的代码
Jul 05 PHP
php标签云的实现代码
Oct 10 PHP
解析crontab php自动运行的方法
Jun 24 PHP
PHP防止表单重复提交的几种常用方法汇总
Aug 19 PHP
php中$_GET与$_POST过滤sql注入的方法
Nov 03 PHP
教你在header中隐藏php的版本信息
Aug 10 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
Aug 29 PHP
PHP数组常用函数实例小结
Aug 20 PHP
php中Swoole的热更新实现代码实例
Mar 04 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
《APMServ 5.1.2》使用图解
2006/10/23 PHP
php zlib压缩和解压缩swf文件的代码
2008/12/30 PHP
php与mysql建立连接并执行SQL语句的代码
2011/07/04 PHP
抓取并下载CSS中所有图片文件的php代码
2011/09/26 PHP
基于MySQL体系结构的分析
2013/05/02 PHP
作为PHP程序员应该了解MongoDB的五件事
2013/06/03 PHP
浅析php中三个等号(===)和两个等号(==)的区别
2013/08/06 PHP
Thinkphp模板中截取字符串函数简介
2014/06/17 PHP
YII框架模块化处理操作示例
2019/04/26 PHP
PHP 图片处理
2020/09/16 PHP
JavaScript的parseInt 进制问题
2009/05/07 Javascript
基于jQuery的实现简单的分页控件
2010/10/10 Javascript
jQuery的学习步骤
2011/02/23 Javascript
JQuery扩展插件Validate 3通过参数设置错误信息
2011/09/05 Javascript
如何让div span等元素能响应键盘事件操作指南
2012/11/13 Javascript
jQuery增加自定义函数的方法
2015/07/18 Javascript
单击按钮发送验证码,出现倒计时的简单实例
2017/03/17 Javascript
AngularJS中filter的使用实例详解
2017/08/25 Javascript
使用JavaScript实现在页面中显示距离2017年中秋节的天数
2017/09/26 Javascript
JS字符串去除连续或全部重复字符的实例
2018/03/08 Javascript
原生JS实现动态加载js文件并在加载成功后执行回调函数的方法
2020/12/30 Javascript
解决vuejs项目里css引用背景图片不能显示的问题
2018/09/13 Javascript
微信小程序设置滚动条过程详解
2019/07/25 Javascript
用python实现的去除win下文本文件头部BOM的代码
2013/02/10 Python
pyspark.sql.DataFrame与pandas.DataFrame之间的相互转换实例
2018/08/02 Python
Python学习笔记之错误和异常及访问错误消息详解
2019/08/08 Python
Pandas DataFrame求差集的示例代码
2020/12/13 Python
美国室内盆栽植物购买网站:Plants.com
2020/04/24 全球购物
Yahoo-PHP面试题1
2016/07/20 面试题
分布式数据库需要考虑哪些问题
2013/12/08 面试题
汽车检测与维修专业求职信
2013/10/30 职场文书
党员的自我评价范文
2014/01/02 职场文书
高中生的自我鉴定范文
2014/01/24 职场文书
材料工程专业毕业生求职信
2014/03/04 职场文书
2015大学生党员自我评价范文
2015/03/03 职场文书
2015年度工程师评职称工作总结
2015/10/14 职场文书