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
php购物网站支付paypal使用方法
Nov 28 PHP
pdo中使用参数化查询sql
Aug 11 PHP
PHP获取搜索引擎关键字来源的函数(支持百度和谷歌等搜索引擎)
Oct 03 PHP
基于session_unset与session_destroy的区别详解
Jun 03 PHP
php判断页面是否是微信打开的示例(微信打开网页)
Apr 25 PHP
PHP文件锁定写入实例解析
Jul 14 PHP
PHP基于phpqrcode生成带LOGO图像的二维码实例
Jul 10 PHP
php生成静态html页面的方法(2种方法)
Sep 14 PHP
php 读写json文件及修改json的方法
Mar 07 PHP
Yii框架引入coreseek分页功能示例
Feb 08 PHP
laravel框架 api自定义全局异常处理方法
Oct 11 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 和 XML: 使用expat函数(三)
2006/10/09 PHP
excellent!――ASCII Art(由目标图象生成ascii)
2007/02/20 PHP
php中FTP函数ftp_connect、ftp_login与ftp_chmod用法
2014/11/18 PHP
PHP页面跳转实现延时跳转的方法
2016/12/10 PHP
获取HTML DOM节点元素的方法的总结
2009/08/21 Javascript
js加载之使用DOM方法动态加载Javascript文件
2013/11/08 Javascript
jquery select 设置默认选中的示例代码
2014/02/07 Javascript
javascript实现浏览器窗口传递参数的方法
2014/09/03 Javascript
原生javascript实现DIV拖拽并计算重复面积
2015/01/02 Javascript
JavaScript使表单中的内容显示在屏幕上的方法
2015/06/29 Javascript
基于Bootstrap使用jQuery实现简单可编辑表格
2016/05/04 Javascript
基于JS+Canves实现点击按钮水波纹效果
2016/09/15 Javascript
jQuery制作全屏宽度固定高度轮播图(实例讲解)
2017/07/08 jQuery
karma+webpack搭建vue单元测试环境的方法示例
2018/05/24 Javascript
socket io与vue-cli的结合使用的示例代码
2018/11/01 Javascript
用jQuery将JavaScript对象转换为querystring查询字符串的方法
2018/11/12 jQuery
Nodejs中怎么实现函数的串行执行
2019/03/02 NodeJs
Element Collapse 折叠面板的使用方法
2020/07/26 Javascript
jQuery实现雪花飘落效果
2020/08/02 jQuery
javascript使用canvas实现饼状图效果
2020/09/08 Javascript
初学python数组的处理代码
2011/01/04 Python
Python中创建字典的几种方法总结(推荐)
2017/04/27 Python
python selenium自动上传有赞单号的操作方法
2018/07/05 Python
numpy.std() 计算矩阵标准差的方法
2018/07/11 Python
python多进程控制学习小结
2018/10/31 Python
浅谈python多进程共享变量Value的使用tips
2019/07/16 Python
Python数组并集交集补集代码实例
2020/02/18 Python
python使用for...else跳出双层嵌套循环的方法实例
2020/05/17 Python
基于K.image_data_format() == 'channels_first' 的理解
2020/06/29 Python
Python通过字典映射函数实现switch
2020/11/06 Python
call在Python中改进数列的实例讲解
2020/12/09 Python
Python Socket多线程并发原理及实现
2020/12/11 Python
铭立家具面试题
2012/12/06 面试题
高中美术教学反思
2014/01/19 职场文书
初中英语教学反思
2014/01/25 职场文书
pytorch训练神经网络爆内存的解决方案
2021/05/22 Python