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 相关文章推荐
Classes and Objects in PHP5-面向对象编程 [1]
Oct 09 PHP
新闻分类录入、显示系统
Oct 09 PHP
PHP压缩html网页代码(清除空格,换行符,制表符,注释标记)
Apr 02 PHP
比较discuz和ecshop的截取字符串函数php版
Sep 03 PHP
基于php下载文件的详解
Jun 02 PHP
深入解析php中的foreach函数
Aug 31 PHP
Zend Framework分页类用法详解
Mar 22 PHP
PHP使用imagick扩展实现合并图像的方法
Apr 25 PHP
PHP面向对象程序设计(OOP)之方法重写(override)操作示例
Dec 21 PHP
PHP PDOStatement::closeCursor讲解
Jan 30 PHP
PHP simplexml_load_file()函数讲解
Feb 03 PHP
PHP进阶学习之依赖注入与Ioc容器详解
Jun 19 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默认安装产生系统漏洞
2006/10/09 PHP
php中取得文件的后缀名?
2012/02/20 PHP
PHP函数addslashes和mysql_real_escape_string的区别
2014/04/22 PHP
php魔术方法功能与用法实例分析
2016/10/19 PHP
PHP 用session与gd库实现简单验证码生成与验证的类方法
2016/11/15 PHP
javascript中的location用法简单介绍
2007/03/07 Javascript
JS添加删除一组文本框并对输入信息加以验证判断其正确性
2013/04/11 Javascript
sencha touch 模仿tabpanel导航栏TabBar的实例代码
2013/10/24 Javascript
JS案例分享之金额小写转大写
2014/05/15 Javascript
JavaScript实现弹出子窗口并传值给父窗口
2014/12/18 Javascript
用javascript实现自动输出网页文本
2015/07/30 Javascript
jQuery simplePage+AJAX plus分页插件用法实例
2016/02/17 Javascript
DIV+CSS+jQ实现省市联动可扩展
2016/06/22 Javascript
详解jQuery中关于Ajax的几个常用的函数
2017/07/17 jQuery
vue 表单验证按钮事件交由父组件触发的方法
2018/12/17 Javascript
解析Python中的异常处理
2015/04/28 Python
浅谈pandas用groupby后对层级索引levels的处理方法
2018/11/06 Python
Python之循环结构
2019/01/15 Python
Python高级特性 切片 迭代解析
2019/08/23 Python
pytorch 指定gpu训练与多gpu并行训练示例
2019/12/31 Python
基于python计算并显示日间、星期客流高峰
2020/05/07 Python
Python爬虫爬取糗事百科段子实例分享
2020/07/31 Python
加拿大最大的五金、家居装修和园艺产品商店:RONA
2017/01/27 全球购物
意大利会呼吸的鞋:Geox健乐士
2017/02/12 全球购物
Bogner美国官网:滑雪服中的”Dior”
2018/01/30 全球购物
亚马逊海外购:亚马逊美国、英国、日本、德国直邮
2021/03/18 全球购物
主治医师岗位职责
2013/12/10 职场文书
乡镇干部先进事迹材料
2014/02/03 职场文书
查摆问题整改措施范文
2014/10/11 职场文书
放射科岗位职责
2015/02/14 职场文书
党校毕业个人总结
2015/02/28 职场文书
土建施工员岗位职责
2015/04/11 职场文书
2015年节能减排工作总结
2015/05/14 职场文书
React forwardRef的使用方法及注意点
2021/06/13 Javascript
解决vue中provide inject的响应式监听
2022/04/19 Vue.js
Spring Cloud OAuth2实现自定义token返回格式
2022/06/25 Java/Android