[SCRIPT] Онлайн на сайте

Тема в разделе "Веб скрипты (WEB)", создана пользователем root, 1 окт 2014.

  1. root

    root Administrator Команда форума Administrator Moderator Developers Team

    Регистрация:
    23 авг 2014
    Сообщения:
    254
    Симпатии:
    58
    Баллы:
    11
    Скрипт на PHP для вывода на сайт текущего онлайна и рекорда.
    Информация кэшируется в файле status.txt (время жизни кэша - параметр interval в конструкторе).
    Написано (надеюсь =) довольно грамотно (с блокировками файлов и т.д. =), ошибок на странице появляться не должно, нагрузка на сервер и сайт минимальная, БД не требуется.

    Внимание! данный скрипт работает с сервером авторизации hAuthD
    Код:
    <? //by Hint (27.06.2008) 
    class ServerStatus 
    { 
       private $ip,$port,$interval,$timeout; 
    
    
       public function __construct($ip='127.0.0.1',$port=2106,$interval=30,$timeout=1) 
       { 
          $this->ip=$ip; 
          $this->port=$port; 
          $this->interval=$interval; 
          $this->timeout=$timeout; 
       } 
    
    
       public function GetStatusFromAuth() 
       { 
          $status=array(); 
          [email protected]($this->ip,$this->port,$errno,$errstr,$this->timeout); 
          if ($f) 
          { 
             do 
             { 
                $sec=floor($this->timeout); 
                $msec=($this->timeout-$sec)*1000; 
                socket_set_timeout($f,$sec,$msec); 
    
    
                $buf=fread($f,2); 
                if (strlen($buf)!=2) break; 
                $a=unpack('vsize',$buf); 
                $size=$a['size']-2; 
                if ($size<1) break; 
    
    
                $buf=fread($f,$size); 
                if (strlen($buf)!=$size) break; 
    
    
                fwrite($f,"\x03\x00\xFE",3); 
    
    
                $buf=fread($f,2); 
                if (strlen($buf)!=2) break; 
                $a=unpack('vsize',$buf); 
                $size=$a['size']-2; 
                if ($size<1) break; 
    
    
                $buf=fread($f,$size); 
                if (strlen($buf)!=$size) break; 
    
    
                if (ord($buf[0])!=0xFE) break; 
                if (strlen($buf)<3) break; 
                $amount=ord($buf[1])+ord($buf[2])*256; 
                $buf=substr($buf,3); 
                if (strlen($buf)!=$amount*4) break; 
                $a=unpack('v'.($amount*2),$buf); 
                for ($i=0;$i<$amount;$i++) $status[$a[$i*2+1]]=$a[$i*2+2]; 
             } 
             while (false); 
             fclose ($f); 
          } 
          return $status; 
       } 
    
    
       public function GetStatus() 
       { 
          $fn=dirname(__FILE__).'/status.txt'; 
          $status=array(); 
          fclose(fopen($fn,'a+b')); 
          [email protected]($fn,'r+b'); 
          if ($f) 
          { 
             flock($f,LOCK_EX); 
             $cache=unserialize(fread($f,1024)); 
             [email protected]$cache['status']; 
             [email protected]$cache['time']; 
             if (!IsSet($status) || !IsSet($time)) 
             { 
                $status=array(); 
                $time=0; 
             } 
             if (time()-$time>$this->interval) 
             { 
                $new=$this->GetStatusFromAuth(); 
                foreach ($status as $id => $value) 
                { 
                   $c=&$status[$id]; 
                   $c['on']=false; 
                   $c['cur']=0; 
                } 
                foreach ($new as $id => $value) 
                { 
                   if (!IsSet($status[$id])) $status[$id]=array('on'=>false,'cur'=>0,'max'=>0); 
                   $c=&$status[$id]; 
                   $c['on']=true; 
                   $c['cur']=$new[$id]; 
                   if ($c['cur']>$c['max']) $c['max']=$c['cur']; 
                } 
                $cache=array('status'=>$status,'time'=>time()); 
                $s=serialize($cache); 
                rewind($f); 
                ftruncate($f,0); 
                fwrite($f,$s,strlen($s)); 
             } 
             fclose($f); 
          } 
          return $status; 
       } 
    
    
       public function GetText($id,$online,$offline) 
       { 
          $status=$this->GetStatus(); 
          if (IsSet($status[$id])) $c=&$status[$id]; else $c=array('on'=>false,'cur'=>0,'max'=>0); 
          $res=str_replace(array('%c','%m'),array($c['cur'],$c['max']),$c['on']?$online:$offline); 
          return $res; 
       } 
    } 
    ?> 
    Пример использования:
    Код:
    $status=new ServerStatus('127.0.0.1'); $online='Статус: <b><font color="#00AA00">online</font></b> | Игроков: <b>%c</b> | Рекорд: <b>%m</b>'; 
    $offline='Статус: <b><font color="#FF0000">offline</font></b> | Игроков: <b>%c</b> | Рекорд: <b>%m</b>'; 
    echo $status->GetText(1,$online,$offline); //1 - ID сервера