如何用 php 精确统计在线人数

原创 2004年09月28日 01:12:00
在论坛里有人问我如何统计在线人数?我也不知道什么是最好的方法。下面是本站的实现的原理,我把它写出来,供大家参考。这只是我的方法,肯定不是最好的,还希望高手们予以指正。

其实,要真正统计同时在并发在线的人数,是一件不太现实的事,这是因为HTTP协议是种无状态的协议。当客户端向服务器发出一个请求时,服务器会马上建立一个新的TCP/IP连接,在该会话结束后,如页面完全载入后,这个连接就关闭了。一般来说,在线人数指的定是在一定时间段内同时访问站点的人数,而不是基于HTTP协议的并发连接数。

让我们先来看看一个访客是如何访问一个网站的。他在浏览器的地址栏里输入了目标网站的地址,然后在一段时间内持续浏览该网站的网页,最后,关闭浏览器或输入新的网址——浏览结束了。对于服务器端来说,访客到来是可以知道的,访客在浏览页面也是可以知道的,可是怎么知道什么时候走的呢?由于HTTP协议是无状态的,所以无法知道。通常的做法是记下访客最后一次浏览站点页面的时间。如果该访客在一个特定的时间内没有新的动作,那么可以认为他走了。

根据上面的这个思路,我觉得最好用数据库,因为数据库要比其他方法如文本文件的效率要高。下面的例子是使用MySQL的,很容易使用其他类型的数据库系统。然后,在所有的页面中调用这个PHP文件,一方面更新数据,另一方面可以显示在线的人数。但是,有一个问题--到底在多长时间内访问的人算是并发的呢?一般来说,是半个小时,也就是1800秒,具体的要根据网站的情况来确定。这个时间越长,统计出的并发在线的人数就越多。本站的是15分钟,900秒。用访问者的IP地址表示一个访问者是个不错的方法。在拨号上网的情况下,被分配了相同IP地址的两个用户在短时间内浏览同一个网站的概率是很小的。

首先,用MySQL的工具建一个表:

CREATE TABLE ccol(
id integer not null auto_increment, #记录的ID
ip char(15) not null, #访问者的IP地址
dtstamp datetime not null, #最后访问时间
uri char(255), #访问者请求的URI
primary key (id)
);

然后,写一段PHP代码:

<?
/*
文件:ccol.php - ConCurrent OnLine statistics
目的:统计同时在线浏览的人数
作者:Hunte, hunte@phpuser.com
修改:2000-4-25
*/

$duration=1800;
require "db.php";
//包含DBSQL,详情可以参考我的另一篇文章
$ccol=new dbSQL;
$ccol->connect();
$ccol->query("DELETE FROM ccol WHERE (UNIX_TIMESTAMP(NOW())-UNIX_TIMESTAMP(dtstamp))>$duration");
//删除超过半小时的记录
$ccol->query("SELECT * FROM ccol WHERE ip='$REMOTE_ADDR'");
//判断当前的IP是否在该表中存在
if ($ccol->nf())//有?
{
$ccol->next_record();//下移找到的记录数组的指针
$id=$ccol->f('id');
$ccol->query("UPDATE ccol SET dtstamp=now(), uri='$REQUEST_URI' WHERE id=$id");
//设置最后访问时间和访问页面
}
else//没有
{
$ccol->query("INSERT INTO ccol VALUES (0, '$REMOTE_ADDR', now(), '$REQUEST_URI')");
}

$ccol->query("SELECT COUNT(*) AS ccol FROM ccol WHERE (UNIX_TIMESTAMP(NOW())-UNIX_TIMESTAMP(dtstamp))<=$duration");
//找出在半个小时内的记录,后面的WHERE子句可有可无--超出时间的已经被删除了
$ccol->next_record()
echo "在线人数:", $ccol->f('ccol');
$ccol->free_result();
?>

怎么用呢?在站点的每个页面的上面调用这个程序,举例来说:
--index.php
...

cookie记录访问人数

using System; using System.Collections.Generic; using System.Linq; using System.Web; using Syste...
  • zhangge360
  • zhangge360
  • 2014年04月07日 22:51
  • 371

网站在线人数的精确统计的个人看法

我给一个比较有趣的做法,当然很耗费资源。那就是持续连接。。。。 你做一个包含页面,。让每个可访问的页面都用ajax/iframe调用这个。 这个页面的核心代码大致如下。     if (true) {...
  • java2000_net
  • java2000_net
  • 2008年02月10日 06:53
  • 2001

php统计在线人数

php统计在线人数。
  • e421083458
  • e421083458
  • 2014年01月02日 13:42
  • 6853

PHP统计当前在线人数

PHP统计当前在线人数 一、开发环境 1、Windows+Apache+MySQL+PHP的环境。 2、文本编辑器:Sublime。 二、主要技术 PHP 三、具体步骤 本文主要是通过I...
  • mico_cmm
  • mico_cmm
  • 2016年11月10日 21:45
  • 2586

php实现当前用户在线人数

原理:根据不同的IP统计出当前有多少人在线。 实现方式:可以用数据库,也可以用文本。 我这里用了文本实现。...
  • u013718071
  • u013718071
  • 2014年07月01日 10:31
  • 985

REDIS实践之在线人数统计几种方案分析

在线人数统计业务是我们开发web肯定要设计的业务逻辑,本文就会给出几种设计方案,来分析下各个方案的优缺点: 使用有序集合 这种方案能够同时储存在线的用户 和 用户上线时间,能够执行非常多的聚合计算...
  • hao508506
  • hao508506
  • 2016年09月10日 20:31
  • 4303

JavaWeb中的application统计在线人数案例

1、后台部分(a/登录,建一个LoginServlet类继承HttpServlet父类)package com.iotek.servlet; import java.io.IOException; ...
  • java_code_world
  • java_code_world
  • 2016年11月03日 15:16
  • 948

Servlet监听器——实现在线登录人数统计小例子

一、概念 servlet监听器的主要目的是给web应用增加事件处理机制,以便更好的监视和控制web应用的状态变化,从而在后台调用相应处理程序。 二、监听器的类型 1.根据监听对象的类型和范围,分为3...
  • rongxiang111
  • rongxiang111
  • 2016年12月06日 16:37
  • 1881

php+ajax+jq实现在线人数实时显示

代码如下: 当前在线: 首先我们要定义一个动画过程,使用jQuery的animate()函数实现从一个数字到另一个数字的变换过程,以下magic_number()自定义函数将代码整合如下:   ...
  • will5451
  • will5451
  • 2016年06月16日 17:30
  • 1432

web项目设置session监听器,统计同时在线人数

统计同时在线人数
  • bestcxx
  • bestcxx
  • 2016年05月05日 18:36
  • 2072
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何用 php 精确统计在线人数
举报原因:
原因补充:

(最多只允许输入30个字)