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&amp;mysql(六)
Oct 09 PHP
浅析Yii中使用RBAC的完全指南(用户角色权限控制)
Jun 20 PHP
ThinkPHP3.1新特性之对Ajax的支持更加完善
Jun 19 PHP
深入理解PHP中的global
Aug 19 PHP
关于PHP开发的9条建议
Jul 27 PHP
PHP实现基于文本的摩斯电码生成器
Jan 11 PHP
php 获取文件行数的方法总结
Oct 11 PHP
PHP 中常量的知识整理
Apr 14 PHP
Laravel如何使用Redis共享Session
Feb 23 PHP
PHP APP微信提现接口代码
Sep 30 PHP
Laravel中10个有用的用法小结
May 06 PHP
Vagrant(WSL)+PHPStorm+Xdebu 断点调试环境搭建
Dec 13 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默认安装产生系统漏洞
2006/10/09 PHP
php获得文件扩展名三法
2006/11/25 PHP
PHP实现的简单网络硬盘
2015/07/29 PHP
PHP开发中AJAX技术的简单应用
2015/12/11 PHP
Laravel实现自定义错误输出内容的方法
2016/10/10 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
2017/08/29 PHP
OAuth认证协议中的HMACSHA1加密算法(实例)
2017/10/25 PHP
php实现快速对二维数组某一列进行组装的方法小结
2019/12/04 PHP
jquery必须知道的一些常用特效方法及使用示例(整理)
2013/06/24 Javascript
JS实现网页滚动条感应鼠标变色的方法
2015/02/26 Javascript
由浅入深剖析Angular表单验证
2016/07/14 Javascript
JavaScript中闭包之浅析解读(必看篇)
2016/08/25 Javascript
用JS动态设置CSS样式常见方法小结(推荐)
2016/11/10 Javascript
jQuery+Ajax实现用户名重名实时检测
2017/06/01 jQuery
input type=file 选择图片并且实现预览效果的实例
2017/10/26 Javascript
node.js使用express框架进行文件上传详解
2019/03/03 Javascript
Vue 图片压缩并上传至服务器功能
2020/01/15 Javascript
[01:14]3.19DOTA2发布会 三代刀塔人第二代
2014/03/25 DOTA
python监控网卡流量并使用graphite绘图的示例
2014/04/27 Python
Django Admin 实现外键过滤的方法
2017/09/29 Python
wxPython+Matplotlib绘制折线图表
2019/11/19 Python
Python面向对象封装操作案例详解
2019/12/31 Python
Python + opencv对拍照得到的图片进行背景去除的实现方法
2020/11/18 Python
html5使用canvas画三角形
2014/12/15 HTML / CSS
html5给汉字加拼音加进度条的实现代码
2020/04/07 HTML / CSS
关于HTML5+ API plusready的兼容问题
2020/11/20 HTML / CSS
T3官网:头发造型工具
2019/12/26 全球购物
三下乡活动方案
2014/01/31 职场文书
军训教官感言
2014/03/02 职场文书
关于环保的建议书
2014/05/12 职场文书
社区禁毒宣传活动总结
2015/05/07 职场文书
乡镇司法所2015年度工作总结
2015/10/14 职场文书
不要在HTML中滥用div
2021/05/08 HTML / CSS
python中sqllite插入numpy数组到数据库的实现方法
2021/06/21 Python
十大公认最好看的动漫:《咒术回战》在榜,《钢之炼金术师》第一
2022/03/18 日漫