php实现用户在线时间统计详解


Posted in PHP onOctober 08, 2011

首先介绍一下所涉及的数据表结构,四个字段:
代码如下:

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可能遇到的问题“无法载入mysql扩展” 的解决方法
Apr 16 PHP
PHP源码之 ext/mysql扩展部分
Jul 17 PHP
PHP抽象类 介绍
Jun 13 PHP
php中的PHP_EOL换行符详细解析
Oct 26 PHP
php检测文件编码的方法示例
Apr 25 PHP
Codeigniter实现智能裁剪图片的方法
Jun 12 PHP
ThinkPHP3.1的Widget新用法
Jun 19 PHP
php保存任意网络图片到服务器的方法
Apr 14 PHP
PHP记录页面停留时间的方法
Mar 30 PHP
Thinkphp结合ajaxFileUpload实现异步图片传输示例
Mar 13 PHP
Laravel学习教程之从入口到输出过程详解
Aug 27 PHP
php7 错误处理机制修改实例分析
May 25 PHP
php 文件缓存函数
Oct 08 #PHP
php数字转汉字代码(算法)
Oct 08 #PHP
PHP判断远程url是否有效的几种方法小结
Oct 08 #PHP
php下利用curl判断远程文件是否存在的实现代码
Oct 08 #PHP
PHP下判断网址是否有效的代码
Oct 08 #PHP
Admin generator, filters and I18n
Oct 06 #PHP
如何在symfony中导出为CSV文件中的数据
Oct 06 #PHP
You might like
超外差式晶体管收音机的组装与统调
2021/03/01 无线电
实现树状结构的两种方法
2006/10/09 PHP
PHP 递归效率分析
2009/11/24 PHP
Symfony2框架学习笔记之HTTP Cache用法详解
2016/03/18 PHP
php lcg_value与mt_rand生成0~1随机小数的效果对比分析
2017/04/05 PHP
yii2 resetful 授权验证详解
2017/05/18 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
2018/02/07 PHP
PHP命名空间定义与用法实例分析
2019/08/14 PHP
PHP实现cookie跨域session共享的方法分析
2019/08/23 PHP
Yii redis集合的基本使用教程
2020/06/14 PHP
Firefox和IE浏览器兼容JS脚本写法小结
2008/07/07 Javascript
js实现一个省市区三级联动选择框代码分享
2013/03/06 Javascript
jQuery获取iframe的document对象的方法
2014/10/10 Javascript
javascript制作坦克大战全纪录(1)
2014/11/27 Javascript
JavaScript数组和循环详解
2015/04/27 Javascript
JavaScript中捕获/阻止捕获、冒泡/阻止冒泡方法
2016/12/07 Javascript
微信小程序实现根据字母选择城市功能
2017/08/16 Javascript
在vue中获取wangeditor的html和text的操作
2020/10/23 Javascript
vue.js封装switch开关组件的操作
2020/10/26 Javascript
[38:54]完美世界DOTA2联赛PWL S2 Rebirth vs LBZS 第一场 11.28
2020/12/01 DOTA
Python爬取读者并制作成PDF
2015/03/10 Python
python实现将元祖转换成数组的方法
2015/05/04 Python
在Python中使用PIL模块对图片进行高斯模糊处理的教程
2015/05/05 Python
Python实现爬虫设置代理IP和伪装成浏览器的方法分享
2018/05/07 Python
解决PyCharm不运行脚本,而是运行单元测试的问题
2019/01/17 Python
pycharm双击无响应(打不开问题解决办法)
2020/01/10 Python
Django中的AutoField字段使用
2020/05/18 Python
Python的历史与优缺点整理
2020/05/26 Python
Python中的全局变量如何理解
2020/06/04 Python
python实现图片素描效果
2020/09/26 Python
CSS3 text-shadow实现文字阴影效果
2016/02/24 HTML / CSS
颇特女士:NET-A-PORTER(直邮中国)
2020/07/11 全球购物
在DELPHI中调用存储过程和使用内嵌SQL哪种方式更好
2016/11/22 面试题
端午节粽子促销活动方案
2014/02/02 职场文书
大学同学十年聚会感言
2014/02/21 职场文书
企业文化学习心得体会
2016/01/21 职场文书