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 相关文章推荐
php上传、管理照片示例
Oct 09 PHP
用PHP的ob_start();控制您的浏览器cache!
Nov 25 PHP
php fputcsv命令 写csv文件遇到的小问题(多维数组连接符)
May 24 PHP
PHP5函数小全(分享)
Jun 06 PHP
PHP学习笔记(一):基本语法之标记、空白、和注释
Apr 17 PHP
举例讲解PHP面对对象编程的多态
Aug 12 PHP
PHP基于单例模式实现的mysql类
Jan 09 PHP
php基于Redis消息队列实现的消息推送的方法
Nov 28 PHP
PHP小程序支付功能完整版【基于thinkPHP】
Mar 26 PHP
PHP判断函数是否被定义的方法
Jun 21 PHP
thinkphp5实现微信扫码支付
Dec 23 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
Mar 26 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
PHP中for循环语句的几种变型
2007/03/16 PHP
php输出echo、print、print_r、printf、sprintf、var_dump的区别比较
2013/06/21 PHP
destoon实现首页显示供应、企业、资讯条数的方法
2014/07/15 PHP
PHP面向对象程序设计内置标准类,普通数据类型转为对象类型示例
2019/06/12 PHP
javascript replace()正则替换实现代码
2010/02/26 Javascript
jquery遍历筛选数组的几种方法和遍历解析json对象
2013/12/13 Javascript
JavaScript学习笔记之定时器
2015/01/22 Javascript
jQuery解决$符号命名冲突
2016/06/18 Javascript
input file样式修改以及图片预览删除功能详细概括(推荐)
2017/08/17 Javascript
详解webpack多页面配置记录
2018/01/22 Javascript
浅谈webpack打包生成的bundle.js文件过大的问题
2018/02/22 Javascript
详解如何用babel转换es6的class语法
2018/04/03 Javascript
微信小程序实现手指触摸画板
2018/07/09 Javascript
浅析vue插槽和作用域插槽的理解
2019/04/22 Javascript
Python生成不重复随机值的方法
2015/05/11 Python
python绘图方法实例入门
2015/05/19 Python
使用Python多线程爬虫爬取电影天堂资源
2016/09/23 Python
通过shell+python实现企业微信预警
2019/03/07 Python
Python3.5 + sklearn利用SVM自动识别字母验证码方法示例
2019/05/10 Python
python  logging日志打印过程解析
2019/10/22 Python
Python实现随机生成任意数量车牌号
2020/01/21 Python
python对指定字符串逆序的6种方法(小结)
2020/04/02 Python
利用python中的matplotlib打印混淆矩阵实例
2020/06/16 Python
在keras中对单一输入图像进行预测并返回预测结果操作
2020/07/09 Python
Keras保存模型并载入模型继续训练的实现
2021/02/20 Python
浅谈html5增强的页面元素
2016/06/14 HTML / CSS
Superdry瑞典官网:英国日本街头风品牌
2017/05/17 全球购物
澳大利亚在线性感内衣商店:Fantasy Lingerie
2021/02/07 全球购物
科颜氏印度官网:Kiehl’s印度
2021/02/20 全球购物
Java基础面试题
2014/07/19 面试题
酒店副总经理岗位职责范本
2014/02/04 职场文书
幼师求职自荐信
2014/05/31 职场文书
税务会计岗位职责
2015/04/02 职场文书
2015年大学辅导员工作总结
2015/05/12 职场文书
2015年林业工作总结
2015/05/14 职场文书
建立共青团委员会的请示
2019/04/02 职场文书