首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | 服务器技术 | linux相关 | linux认证 | 嵌入式 | 下载中心 | 专题 | linux招聘 | 镜像站
OKLinux中文技术站
·设为首页
·加入收藏
·联系我们
系统管理: 中文环境 系统管理 桌面应用 内核技术 | Linux基础: 基础入门 安装配置 常用命令 经验技巧 软件应用 | Linux数据库: Mysql Postgre Oracle DB2 Sybase other
网络管理: 网络安全 网络应用 Linux服务器 环境配置 黑客安全 | 编程开发: PHP CC++ Python Perl Shell 嵌入式开发 java jsp | PHP技术: PHP基础 PHP技巧 PHP应用 PHP文摘
Linux资讯 Linux招聘 Linux专题 Apache | Linux相关: 硬件相关 Linux解决方案 Linux认证 企业应用 其它Unix | 相关下载: 资料下载 参考手册 开发工具 服务器类 软路由 其它
 技术搜索:
会员中心 注册会员 高级搜索  
  → 当前位置:首页>编程开发>php>php基础>正文

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

http://www.oklinux.cn  2003-05-01  来源: 互联网    会员收藏  游客收藏  【 】 
在论坛里有人问我如何统计在线人数?我也不知道什么是最好的方法。下面是本站的实现的原理,我把它写出来,供大家参考。这只是我的方法,肯定不是最好的,还希望高手们予以指正。
其实,要真正统计同时在并发在线的人数,是一件不太现实的事,这是因为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, [email protected]
修改: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.phpBy phpfans.net收集整理

上一篇:删除数组中重复元素的函数   下一篇:如何编译PHP源代码(介绍ZendEncode的安装方法)(我今天刚调试成


收藏于收藏夹】 【评论】 【推荐】 【打印】 【关闭
相关文档
·如何编译PHP源代码(介绍ZendEncode的安装方法)(我今
·删除数组中重复元素的函数
·生成 MD5 密码
·浅谈PHP语法(3)
·什么是LDAP
·抛开Cookie使用SESSION-PHP中SESSION不能跨页传递问
·php函数索引(1)
·实例学习 PHP 之投票程序篇
·使用 PHP 建立 GIF
·php发送带附件的邮件
·PHP的相关运行环境
·文件上传
·写的一个比较烂的目录文件列表程序,支持多系统,可按
·PHP的安装(1)-PHP及其模块的安装
·一个很简单的PHP投票系统
·PHP程序的常见漏洞攻击分析
发表评论
密码: 匿名评论
评论内容:

(不超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规)
 
  最新文档
·用PHP执行Oracle存储过程示例
·用php做一个简单的表单
·用Socket发送电子邮件(二)
·用Socket发送电子邮件(一)
·用中文命名,让汉字走向程序开发
·在Linux下安装显卡驱动程序
·在PHP中用描点法“绘制”中文
·在线人数统计源代码
·怎么样可以把 phpinfo()屏蔽掉
·则表达式判断email和URL
·正则表达式(regular expression)
·正则表达式使用详解(二)
  阅读排行
·php.ini 中文版
·PHP安装全攻略:常见问题解答
·Linux新手入门常用命令大全
·入门教程:学习使用PHP数组
·利用PHP和CSS改变网页文字大小
·用AJAX实现聊天功能(part 1)
·PHP5学习笔记第二节PHP5的对象模型
·PHP程序编译中常见错误信息分析及解释
·PHP开发中最常见的文件操作疑难解答
·带你走进PHP世界 PHP新手上路之一
·PHPMyVisites安装
·使用PHP实现登陆验证码
·基于PHP的AJAX技术实现文件异步上传
·视频演示:Zend Platform功能特性详解
·ajax的最大缺点是什么?对搜索引擎的支
网摘收藏: