PHP统计当前在线用户数实例讲解


Posted in PHP onOctober 21, 2015

通常,当访客访问网站时,页面记录用户的cookie信息,当cookie过期即认为用户不在线。本文中我们使用PHP记录访客IP,并在客户端记录cookie及过期时间,同时通过新浪IP地址接口,获取访客的地理位置(本例只记录省份),一并写入mysql表中,即可统计一段时间内的访客总数,也可以查看访客的地区分布。

PHP统计当前在线用户数实例讲解

HTML
我们在页面上放置一个显示当前在线人数的div#total以及一个用于展示访客地区分布的列表#onlinelist,默认我们在列表中放置一张与加载动画图片,后面我们用jQuery控制当鼠标滑向时展示详细列表。

<div class="demo"> 
  <div id="total">当前在线:<span id="onlinenum"></span></div> 
  <ul id="onlinelist"> 
    <li><img src="loader.gif"></li> 
  </ul> 
</div>

CSS
我们用CSS来渲染显示效果,为了就是不让我们的示例很难看,下面的代码中,我们使用了CSS3,时代在进步啊,所以建议使用现代浏览器预览效果。

.demo{width:150px; margin:20px auto; font-size:14px} 
#total{padding:6px 10px; background:#090 url(arr.png) no-repeat right top; color:#fff; 
cursor:pointer; -moz-border-radius:5px; -webkit-border-radius:5px; border-radius:5px; 
-moz-box-shadow:0 0 3px #ccc; -webkit-box-shadow:0 0 3px #ccc;box-shadow:0 0 3px #ccc;} 
#onlinelist{background:#f7f7f7; border:1px solid #d3d3d3; display:none; -moz-border-radius:5px; 
-webkit-border-radius:5px; border-radius:5px; -moz-box-shadow:0 0 3px #ccc; 
-webkit-box-shadow:0 0 3px #ccc;box-shadow:0 0 3px #ccc;} 
#onlinelist li{height:20px; line-height:20px;padding:4px 6px;border-bottom:1px dotted #d9d9d9} 
#onlinelist li span{float:right} 
#onlinelist li:hover{background:#fff}

Mysql
我们要准备一张数据表online,用来记录访客IP、地区及访问时间。整个示例统计过程都依赖这张表,其结构如下:

CREATE TABLE IF NOT EXISTS `online` ( 
 `id` int(11) NOT NULL AUTO_INCREMENT, 
 `ip` varchar(30) NOT NULL, 
 `province` varchar(64) NOT NULL, 
 `addtime` int(10) NOT NULL DEFAULT '0', 
 PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

PHP
online.php用来记录访客信息,包括IP地址和地区。首先检测数据表中是否有访客IP记录,如果有,则只更新访问时间,否则,获取用户省份区域,并将用户IP即省份区域插入到表中。在此,可以判断是否存在访客的cookie记录,如果不存在则向新浪IP地址库请求获取访客的区域信息,并设置cookie值和过期时间。最后,我们删除表中已经过期的记录,统计总记录数并输出,详细请看代码注释。

include_once('connect.php'); //连接数据库 
 
$ip = get_client_ip(); //获取客户端IP 
$time = time(); 
//查询表中是否有ip为当前访客IP的记录 
$query = mysql_query("select id from online where ip='$ip'"); 
if(!mysql_num_rows($query)){//如果不存在访客IP 
  if($_COOKIE['geoData']){//如果存在cookie,则获取用户的区域 
    $province = $_COOKIE['geoData']; //区域(省份) 
  }else{ 
    $api = "http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=$ip"; 
    $json = file_get_contents($api);//
    $arr = json_decode($json,true);//解析json 
    $province = $arr['province'];//获取省份 
    setcookie('geoData',$province,$time+600); //设置cookie,设置过期时间为10分钟 
  } 
  //将访客信息插入到数据表中 
  mysql_query("insert into online (ip,province,addtime) values ('$ip','$province','$time')"); 
}else{//如果存在,则更新该用户访问时间 
  mysql_query("update online set addtime='$time' where ip='$ip'"); 
} 
//删除已过期的记录 
$outtime = $time-600; 
mysql_query("delete from online where addtime<$outtime"); 
//统计总记录数,即在线用户数 
list($totalOnline) = mysql_fetch_array(mysql_query("select count(*) from online")); 
echo $totalOnline;//输出在线总数 
mysql_close();

函数get_client_ip()用来获取用户真实IP。

function get_client_ip() { 
  if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown")) 
    $ip = getenv("HTTP_CLIENT_IP"); 
  else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), 
"unknown")) 
    $ip = getenv("HTTP_X_FORWARDED_FOR"); 
  else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown")) 
    $ip = getenv("REMOTE_ADDR"); 
  else if (isset ($_SERVER['REMOTE_ADDR']) && 
$_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown")) 
    $ip = $_SERVER['REMOTE_ADDR']; 
  else 
    $ip = "unknown"; 
  return ($ip); 
}

geo.php用来统计各省份(区域)访客人数分布。通过查询数据库,并按省份分组排序即可,注意我们将最终的数据集以JSON的形式输出,便于前端ajax交互。

include_once('connect.php');//连接数据库 
//查询区域统计 
$sql = "select province,count(*) as total from online group by province order by total desc"; 
$result = mysql_query($sql); 
while($row=mysql_fetch_array($result)){ 
  $list[] = array( 
    'province' => $row['province'], 
    'total' => $row['total'] 
  );  
} 
echo json_encode($list);//以json格式输出

jQuery
前端页面需要做的是,页面加载时展示访客总数,即使用ajax请求online.php即可。然后当鼠标滑向统计箭头时,通过ajax请求geo.php获取各区域省份的在线人数,并以下拉的方式展现效果。

$(function(){ 
  $("#onlinenum").load("online.php"); 
   
  $(".demo").hover(function(){ 
    $("#onlinelist").slideDown("fast"); 
    var str = ''; 
    $.getJSON("geo.php",function(json){ 
      $.each(json,function(index,array){ 
        str = str + "<li><span>"+array['total']+"</span>"+array['province']+"</li>"; 
      }); 
      $("#onlinelist").html(str); 
    }); 
  },function(){ 
    $("#onlinelist").slideUp("fast"); 
  }); 
});

最后,该示例依赖,所以别忘了在页面中请先加载jquery库,目前已经到jquery-1.9.1版本了。

是不是内容很精彩,很丰富,就是分享给大家的,希望对大家的学习有所帮助。

PHP 相关文章推荐
服务器端解压缩zip的脚本
Dec 22 PHP
连接到txt文本的超链接,不直接打开而是点击后下载的处理方法
Jul 01 PHP
PHP 执行系统外部命令 system() exec() passthru()
Aug 11 PHP
php中获取关键词及所属来源搜索引擎名称的代码
Feb 15 PHP
php模板中出现空行解决方法
Mar 08 PHP
php异常:Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE  eval()'d code error
May 19 PHP
使用session判断用户登录用户权限(超简单)
Jun 08 PHP
本地机apache配置基于域名的虚拟主机详解
Aug 10 PHP
Zend Framework动作助手Url用法详解
Mar 05 PHP
PHP 类与构造函数解析
Feb 06 PHP
PHP使用标准库spl实现的观察者模式示例
Aug 04 PHP
linux mint下安装phpstorm2020包括JDK部分的教程详解
Sep 17 PHP
php精确的统计在线人数的方法
Oct 21 #PHP
为你总结一些php信息函数
Oct 21 #PHP
深入理解PHP变量的值类型和引用类型
Oct 21 #PHP
为你总结一些php系统类函数
Oct 21 #PHP
功能强大的PHP图片处理类(水印、透明度、旋转)
Oct 21 #PHP
使用xampp搭建运行php虚拟主机的详细步骤
Oct 21 #PHP
php获取汉字拼音首字母的方法
Oct 21 #PHP
You might like
DC动漫人物排行
2020/03/03 欧美动漫
php中将汉字转换成拼音的函数代码
2012/09/08 PHP
详解PHP中cookie和session的区别及cookie和session用法小结
2016/06/12 PHP
document.all与WEB标准
2020/05/13 Javascript
CSDN轮换广告图片轮换效果
2007/03/27 Javascript
js继承的实现代码
2010/08/05 Javascript
JS中Iframe之间传值及子页面与父页面应用
2013/03/11 Javascript
JS中的log对象获取以及debug的写法介绍
2014/03/03 Javascript
jquery-syntax动态语法着色示例代码
2014/05/14 Javascript
JS的事件绑定深入认识
2014/06/26 Javascript
基于JS实现无缝滚动思路及代码分享
2016/06/07 Javascript
jquery实用技巧之输入框提示语句
2016/07/28 Javascript
$.browser.msie 为空或不是对象问题的多种解决方法
2017/03/19 Javascript
vue.js实现刷新当前页面的方法教程
2017/07/05 Javascript
ES6 javascript中class类的get与set用法实例分析
2017/10/30 Javascript
对vue 键盘回车事件的实例讲解
2018/08/25 Javascript
Element 默认勾选表格 toggleRowSelection的实现
2019/09/04 Javascript
vue多页面项目中路由使用history模式的方法
2019/09/23 Javascript
基于vue-cli3创建libs库的实现方法
2019/12/04 Javascript
[01:04:08]完美世界DOTA2联赛PWL S3 INK ICE vs GXR 第一场 12.16
2020/12/18 DOTA
Python基于scapy实现修改IP发送请求的方法示例
2017/07/08 Python
Python编程二分法实现冒泡算法+快速排序代码示例
2018/01/15 Python
使用python中的in ,not in来检查元素是不是在列表中的方法
2018/07/06 Python
python scp 批量同步文件的实现方法
2019/01/03 Python
Python3使用Matplotlib 绘制精美的数学函数图形
2019/04/11 Python
Python3.5内置模块之shelve模块、xml模块、configparser模块、hashlib、hmac模块用法分析
2019/04/27 Python
python实现多进程按序号批量修改文件名的方法示例
2019/12/30 Python
利用django model save方法对未更改的字段依然进行了保存
2020/03/28 Python
pyecharts在数据可视化中的应用详解
2020/06/08 Python
北京SQL新华信咨询
2016/09/30 面试题
仓库管理专业个人的自我评价
2013/12/30 职场文书
冰淇淋开店创业计划书
2014/02/01 职场文书
投标担保书范文
2014/04/02 职场文书
高中生家长寄语大全
2014/04/03 职场文书
优秀管理者事迹材料
2014/05/22 职场文书
幼儿园迎国庆65周年活动策划方案
2014/09/16 职场文书