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
PHP4与PHP5的时间格式问题
Feb 17 PHP
了解Joomla 这款来自国外的php网站管理系统
Mar 11 PHP
PHP 在5.1.* 和5.2.*之间 PDO数据库操作中的不同之处小结
Mar 07 PHP
3个PHP多维数组转为一维数组的方法实例
Mar 13 PHP
php获取网页中图片、DIV内容的简单方法
Jun 19 PHP
ThinkPHP3.1新特性之多层MVC的支持
Jun 19 PHP
php字符串函数学习之substr()
Mar 27 PHP
WordPress的文章自动添加关键词及关键词的SEO优化
Mar 01 PHP
php简单实现批量上传图片的方法
May 09 PHP
PHP长网址与短网址的实现方法
Oct 13 PHP
php使用socket调用http和smtp协议实例小结
Jul 26 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
JS 网站性能优化笔记
2011/05/24 PHP
php 中的4种标记风格介绍
2012/05/10 PHP
自定义php类(查找/修改)xml文档
2013/03/26 PHP
php使用json_encode对变量json编码
2014/04/07 PHP
简单谈谈PHP vs Node.js
2015/07/17 PHP
jquery.ui.draggable中文文档
2009/11/24 Javascript
JQuery中操作Css样式的方法
2014/02/12 Javascript
jquery合并表格中相同文本的相邻单元格
2015/07/17 Javascript
Angularjs中的事件广播 —全面解析$broadcast,$emit,$on
2016/05/17 Javascript
Bootstrap3学习笔记(三)之表格
2016/05/20 Javascript
jQuery中值得注意的trigger方法浅析
2016/12/12 Javascript
微信小程序 MD5的方法详解及实例代码
2017/03/10 Javascript
php 解压zip压缩包内容到指定目录的实例
2018/01/23 Javascript
浅谈Vue3 Composition API如何替换Vue Mixins
2020/04/29 Javascript
三步搞定:Vue.js调用Android原生操作
2020/09/07 Javascript
[01:04:39]OG vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
python str与repr的区别
2013/03/23 Python
python比较两个列表是否相等的方法
2015/07/28 Python
基于Django的ModelForm组件(详解)
2017/12/07 Python
Python内置模块ConfigParser实现配置读写功能的方法
2018/02/12 Python
对numpy中轴与维度的理解
2018/04/18 Python
Django框架组成结构、基本概念与文件功能分析
2019/07/30 Python
Python 爬虫实现增加播客访问量的方法实现
2019/10/31 Python
python飞机大战pygame游戏之敌机出场实现方法详解
2019/12/17 Python
如何使用css3实现一个类在线直播的队列动画的示例代码
2020/06/17 HTML / CSS
美国最好的保健品打折网店:Swanson
2017/08/04 全球购物
美国波西米亚风格服装品牌:Show Me Your Mumu
2018/01/05 全球购物
西班牙鞋子和箱包在线销售网站:zapatos.es
2020/02/17 全球购物
公司庆典邀请函范文
2014/01/13 职场文书
初中数学教学反思
2014/01/16 职场文书
2015年前台个人工作总结
2015/04/03 职场文书
Nginx Rewrite使用场景及配置方法解析
2021/04/01 Servers
Python 流媒体播放器的实现(基于VLC)
2021/04/28 Python
Go语言基础map用法及示例详解
2021/11/17 Golang
海贼王十大潜力果实,路飞仅排第十,第一可毁世界(震震果实)
2022/03/18 日漫
【DOTA2】总决赛血虐~ XTREME GAMING vs MAGMA - OGA DOTA PIT 2022 CN
2022/04/02 DOTA