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 相关文章推荐
用Simple Excel导出xls实现方法
Dec 06 PHP
基于wordpress主题制作的具体实现步骤
May 10 PHP
PHP加密扩展库Mcrypt安装和实例
Nov 10 PHP
php解压文件代码实现php在线解压
Feb 13 PHP
smarty模板中拼接字符串的方法
Feb 14 PHP
查找php配置文件php.ini所在路径的二种方法
May 26 PHP
php获取网页中图片、DIV内容的简单方法
Jun 19 PHP
php实现图片添加描边字和马赛克的方法
Dec 10 PHP
php可应用于面包屑导航的递归寻找家谱树实现方法
Feb 02 PHP
php正则preg_replace_callback函数用法实例
Jun 01 PHP
php根据日期或时间戳获取星座信息和生肖等信息
Oct 20 PHP
windows下的WAMP环境搭建图文教程(推荐)
Jul 27 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读取der格式证书乱码解决方法
2015/06/22 PHP
jQuery使用手册之一
2007/03/24 Javascript
几个高效,简洁的字符处理函数
2007/04/12 Javascript
Jquery CheckBox全选方法代码附js checkbox全选反选代码
2010/06/09 Javascript
JavaScript和ActionScript的交互实现代码
2010/08/01 Javascript
深入理解JavaScript系列(9) 根本没有“JSON对象”这回事!
2012/01/15 Javascript
CSS(js)限制页面显示的文本字符长度
2012/12/27 Javascript
载入jQuery库的最佳方法详细说明及实现代码
2012/12/28 Javascript
Extjs表单常见验证小结
2014/03/07 Javascript
JQuery EasyUI 日期控件如何控制日期选择区间
2014/05/05 Javascript
node.js中的fs.rmdirSync方法使用说明
2014/12/16 Javascript
jQuery选择器源码解读(六):Sizzle选择器匹配逻辑分析
2015/03/31 Javascript
很全面的JavaScript常用功能汇总集合
2016/01/22 Javascript
详解Windows下安装Nodejs步骤
2017/05/18 NodeJs
解决webpack+Vue引入iView找不到字体文件的问题
2018/09/28 Javascript
微信小程序实现左滑修改、删除功能
2020/10/19 Javascript
JS 事件机制完整示例分析
2020/01/15 Javascript
JS代码简洁方式之函数方法详解
2020/07/28 Javascript
[42:36]DOTA2上海特级锦标赛B组败者赛 VG VS Spirit第二局
2016/02/26 DOTA
Python中尝试多线程编程的一个简明例子
2015/04/07 Python
通过Python模块filecmp 对文件比较的实现方法
2018/06/29 Python
Python运行不显示DOS窗口的解决方法
2018/10/22 Python
python运行时强制刷新缓冲区的方法
2019/01/14 Python
python爬虫之自制英汉字典
2019/06/24 Python
python中break、continue 、exit() 、pass终止循环的区别详解
2019/07/08 Python
python递归法实现简易连连看小游戏
2020/03/25 Python
Python基于BeautifulSoup爬取京东商品信息
2020/06/01 Python
python如何输出反斜杠
2020/06/18 Python
python time()的实例用法
2020/11/03 Python
python录音并调用百度语音识别接口的示例
2020/12/01 Python
在IE6系列等老式浏览器中使用HTML5的新标签实现方案
2012/12/25 HTML / CSS
什么是JNDI的上下文?如何初始化JNDI上下文
2012/03/10 面试题
标准导师推荐信(医学类)
2013/10/28 职场文书
毕业生毕业总结的自我评价范文
2013/11/02 职场文书
大学毕业生通用自我评价
2014/01/05 职场文书
在JavaScript中如何使用宏详解
2021/05/06 Javascript