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 '',
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");
});
});

PHP统计当前在线用户数实例的更多相关文章

  1. 基于express+redis高速实现实时在线用户数统计

    作者:zhanhailiang 日期:2014-11-09 本文将介绍怎样基于express+redis高速实现实时在线用户数统计. 1. 在github.com上创建项目uv-tj.将其同步到本地: ...

  2. Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) JAVA日志的前世今生 .NET MVC采用SignalR更新在线用户数 C#多线程编程系列(五)- 使用任务并行库 C#多线程编程系列(三)- 线程同步 C#多线程编程系列(二)- 线程基础 C#多线程编程系列(一)- 简介

    Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) 一.前言 由于本篇文章较长,所以下面给出内容目录方便跳转阅读,当然也可以用博客页面最右侧的文章目录导航栏进行跳转查阅. 一.前言 ...

  3. 关于使用HttpSessionBindingListener获取在线用户数,同一用户登陆一次

    原创地址:http://blog.csdn.net/jiaoxueli/article/details/2226134 考虑到项目中统计在线用户数量和同一用户只能登陆一次的需求,查询联系 HttpSe ...

  4. 基于tomcat获取在线用户数

    https://blog.csdn.net/smallnetvisitor/article/details/84697505 需求: 统计某应用的在线用户数 实现方案: 1.基于session监听(复 ...

  5. 在线用户数-Constants

    package com.pb.news.constants; public class Constants { public static int ONLINE_USER_COUNT=0;//在线用户 ...

  6. 类似"音速启动"的原创工具简码"万能助手"在线用户数终于突破100了!

    原本只是开发出来方便自己的一个小工具,看到群友也喜欢,就随手分享了, 经过1个多月的自然积累,在线用户数终于突破100了,这增长速度实在让人泪奔~ 博客园的朋友如果看到,喜欢的话就拿去用吧, 万能助手 ...

  7. websocket 无需通过轮询服务器的方式以获得响应 同步在线用户数 上线下线 抓包 3-way-handshake web-linux-shell 开发

    https://code.google.com/archive/p/phpwebsocket/source/default/source The WebSocket API (WebSockets) ...

  8. Lotusscript统计在线用户数

    使用notessession的SendConsoleCommand方法向服务器控制台发送“show inetusers”命令,该命令返回一个结果(字符串),字符串类似如下: admin   192.1 ...

  9. 【Shell】建立一个脚本统计当前登录用户数

    who命令 who命令是显示目前登陆系统的用户信息,执行who命令可以得知目前哪些用户登入系统,单独执行who命令会列出登入账号,使用的终端机,登入的时间以及从何处登入或正在使用哪个显示器. 统计用户 ...

随机推荐

  1. 深入分析JavaWeb Item47 -- Struts2拦截器与文件上传下载

    一.struts2中的拦截器(框架功能核心) 1.过滤器VS拦截器 过滤器VS拦截器功能是一回事. 过滤器是Servlet规范中的技术,能够对请求和响应进行过滤. 拦截器是Struts2框架中的技术. ...

  2. HDU 4259(Double Dealing-lcm(x1..xn)=lcm(x1,lcm(x2..xn))

    Double Dealing Time Limit: 50000/20000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  3. SQL Server 2005数据库定期备份(非常详细)与 SQL Server 2005数据库备份定期清理

     SQL Server 2005数据库定期备份 分类: SQL Server 20052011-01-06 16:25 3320人阅读 评论(1) 收藏 举报 sql server数据库sqlserv ...

  4. zoj--3870--Team Formation(位运算好题)

    Team Formation Time Limit: 3000MS   Memory Limit: 131072KB   64bit IO Format: %lld & %llu Submit ...

  5. B1934 [Shoi2007]Vote 善意的投票 最小割

    一开始不太会,结果看完题解就是一个建图的网络流.然后就结了. 题干: 题目描述 幼儿园里有n个小朋友打算通过投票来决定睡不睡午觉.对他们来说,这个问题并不是很重要,于是他们决定发扬谦让精神.虽然每个人 ...

  6. 洛谷 P2668 & P2540 [ noip 2015 ] 斗地主 —— 搜索+贪心

    题目:https://www.luogu.org/problemnew/show/P2668   https://www.luogu.org/problemnew/show/P2540 首先,如果没有 ...

  7. CPPCMS库在Windows下的使用

    标题:CPPCMS库在Windows下的使用时间:2012-7作者:Kagula 环境:[1]WinXP SP3[2]VisualStudio2008 SP1[3]ZLib 1.2.7[4]PCRE ...

  8. 使用 Polyfill 而不再是 bable 来实践js新特性

    现状 我们想要用ES6 语法来写 JavaScript.然而由于我们需要兼容老版本的浏览器,那些浏览器不支持 ES6,我们需要解决这个问题. 有一个标准的做法是:写 ES6 代码 → 将所有代码编译成 ...

  9. linux随便贴贴

    在bin目录下进入mysql: ./mysql -uroot -p123456 update mysql.user set password=password('root') where user=' ...

  10. django的admin后台管理如何更改为中文

    新建Django的admin后端控制为英文显示,为了可以使其显示中文,可以将 setting.py配置文件修改 # LANGUAGE_CODE = 'en-us' # # # # # TIME_ZON ...