发布网友 发布时间:2022-04-22 04:07
共4个回答
热心网友 时间:2023-07-11 10:00
原理:根据不同的IP统计出当前有多少人在线。
实现方式:可以用数据库,也可以用文本。
我这里用了文本实现。
热心网友 时间: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。目前看来,第二种更简单实用