首页 行业资讯 宠物日常 宠物养护 宠物健康 宠物故事

我想用php制作一个在线聊天室,怎么统计在线人数啊?

发布网友 发布时间:2022-04-22 04:07

我来回答

4个回答

热心网友 时间:2023-07-11 10:00

原理:根据不同的IP统计出当前有多少人在线。
实现方式:可以用数据库,也可以用文本。
我这里用了文本实现。


$user_online = "count.php"; // 保存人数的文件
touch ( $user_online ); // 如果没有此文件,则创建
$timeout = 30; // 30秒内没动作者,认为掉线
$user_arr = file_get_contents ( $user_online );
$user_arr = explode ( '#', rtrim ( $user_arr, '#' ) );
print_r ( $user_arr );
$temp = array ();
foreach ( $user_arr as $value ) {
$user = explode ( ",", trim ( $value ) );
if (($user [0] != getenv ( 'REMOTE_ADDR' )) && ($user [1] > time ())) { // 如果不是本用户IP并时间没有超时则放入到数组中
array_push ( $temp, $user [0] . "," . $user [1] );
}
}
array_push ( $temp, getenv ( 'REMOTE_ADDR' ) . "," . (time () + ($timeout)) . '#' ); // 保存本用户的信息
$user_arr = implode ( "#", $temp );
// 写入文件
$fp = fopen ( $user_online, "w" );
flock ( $fp, LOCK_EX ); // flock() 不能在NFS以及其他的一些网络文件系统中正常工作
fputs ( $fp, $user_arr );
flock ( $fp, LOCK_UN );
fclose ( $fp );
echo "当前有" . count ( $temp ) . "人在线";

热心网友 时间:2023-07-11 10:01

给你一个不需要数据库,用xml文件保存的代码

class OnLine{
##################################
private $file;//保存在线人数的xml文件
private $xml;//xml实例化的对象
private $maxNum;//最高在线人数
private $atTime;//最高在线人数的时间
private $virNum;//虚拟在线人数
private $timeOut;//最大超时时间,单位为秒,超时后删除
private $num;//实际在线人数
private $ip;//ip地址
private $time;//当前时间
//默认虚拟人数为0,超时为600秒,xml版本为1.0,xml编码为utf-8,保存时自动格式化
function __construct($file, $virNum=0, $timeOut=600, $version='1.0', $charset='utf8', $format=true){
$this->file = $file;
$this->virNum = $virNum;
$this->timeOut = $timeOut;
$this->maxNum = 0;
$this->atTime = 0;
$this->num = 0;
$this->ip = @$_SERVER['HTTP_HOST'];
$this->time = time();
$this->xml = new DOMDocument('1.0', 'utf-8');
$this->xml->formatOutput = $format;
$this->checkFile();//检查保存在线人数的xml文件是否存在
}
//获取在线人数
public function getNum(){
$this->xml->load($this->file);//加载在线人数xml保存文件
$root = $this->xml->documentElement;
$line = $this->xml->getElementsByTagName('line');
$this->maxNum = (int)$this->xml->getElementsByTagName('maxnum')->item(0)->nodeValue;//获取最高在线人数
$this->atTime = (int)$this->xml->getElementsByTagName('attime')->item(0)->nodeValue;//获取最高在线人数时间
$virnumValue = (int)$this->xml->getElementsByTagName('virnum')->item(0)->nodeValue;//获取虚拟人数
$timeoutValue = (int)$this->xml->getElementsByTagName('timeout')->item(0)->nodeValue;//获取超时时间
$flag = 1;//用于记录ip是否重复
foreach($line as $key=>$value){
$this->num++;//在线人数加一
$ipValue = $value->getElementsByTagName('ip')->item(0)->nodeValue;//获取xml中ip
$timeValue = $value->getElementsByTagName('time')->item(0)->nodeValue;//获取xml中访问的时间
if($ipValue==$this->ip){//如果xml中ip等于正在访问的ip
$flag = 0;//flag标记为0,ip重复
$value->getElementsByTagName('time')->item(0)->nodeValue = $this->time;//更新此ip的访问时间为当前时间
}
if(($this->time-$timeValue) > $timeoutValue){//如果xml中时间大于超时最大时间
$root->removeChild($value);//删除此记录
$this->num--;//实际在线人数减一
}
}
if($flag){//如果当前ip不等于xml中ip
$lineChlid = $this->xml->createElement('line');
$ipChild = $this->xml->createElement('ip');
$timeChild = $this->xml->createElement('time');
$ipContent = $this->xml->createTextNode($this->ip);
$timeContent = $this->xml->createTextNode($this->time);
$ipChild->appendChild($ipContent);
$timeChild->appendChild($timeContent);
$lineChlid->appendChild($ipChild);
$lineChlid->appendChild($timeChild);
$root->appendChild($lineChlid);
$this->xml->appendChild($root);//添加一条记录
$this->num++;//实际人数加一
}
if($this->num > $this->maxNum){//如果当前在线人数大于最高在线人数
$this->maxNum = $this->num;
$this->atTime = $this->time;
$root->getElementsByTagName('maxnum')->item(0)->nodeValue = $this->maxNum;//更新最高在线人数
$root->getElementsByTagName('attime')->item(0)->nodeValue = $this->time;//更新最高在线人数时间
}
$this->save();//保存xml文件
return $this->num + $virnumValue;//返回实际在线人数与虚拟人数相加结果
}

热心网友 时间:2023-07-11 10:01

这个简单以下是本人以前写的源码虽然显示出来很丑,但是自己修饰下就可以了<?php
require_once('config.php');
function counter()
{
session_start();
$sql="select counter from counter";
$result=@mysql_query($sql);
if(!empty($result))
{
$row=mysql_fetch_array($result);
$counter=++$row[counter];
if(!$_SESSION['counter'])
{
$query="update counter set counter=$counter";
$result=@mysql_query($query);
if($result)
{
$_SESSION['counter']=true;
}
}
$counter_len=strlen($counter);
for($i=0;$i<$counter_len;$i++)
{
$number=substr($counter,$i,1);
if(isset($number))
{
echo "<img src='image/".$number.".gif'>";
}
}
}
}
?>

热心网友 时间:2023-07-11 10:02

两种方案:1,每上线一个人就向数据库写入一次数据,然后定期做回收。2,利用数据库储存session。目前看来,第二种更简单实用

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com