Verificar Status Em Php

sharematrix
em Programação Web

sharematrix

avatar
Cavaleiro
Cavaleiro

INFOS

Grupo: CavaleiroRegistrado: 28/07/10Posts: 189Char no Tibia: Diahbo

Olá,

 

Vim trazer aqui um script em php, que verifica se o servidor está online, e diz quantos players/monsters/uptime

 

O Script não foi criado por mim, só fiz alguns ajustes para funcionar no TFS 0.4

 

Então vamos ao script :)

 

<?PHP // ShareMatrix 
$server['host'] .= 'underwar.org';
$server['port'] .= '7171';

// Verificando
$info = chr(6).chr(0).chr(255).chr(255).'info';
$sock = @fsockopen($server['host'],$server['port'], $errno, $errstr, 1);
if ($sock)
{
	fwrite($sock, $info); 
	$data=''; 
	while (!feof($sock))
	$data .= fgets($sock, 4096);
	fclose($sock);
	preg_match('/players online="(\d+)" max="(\d+)"/', $data, $matches);
	$cnf_['players'] .= 'Players: '.$matches[1].' / '.$matches[2].'';
	preg_match('/uptime="(\d+)"/', $data, $matches);
	$hour = floor($matches[1] / 3600);
	$minute = floor(($matches[1] - $h*3600) / 60);
	$cnf_['uptime'] .= $hour.'h '.$minute.'m';
	preg_match('/monsters total="(\d+)"/', $data, $matches);
	$cnf_['monsters'] .= $matches[1];
}
else
{
	$cnf_['players'] .= '0 / 0';
	$cnf_['uptime'] = '0';
	$cnf_['monsters'] = '0 h 0 m';
}
// Mostrando
echo $cnf_['players'];
echo $cnf_['uptime'];
echo $cnf_['monsters'];

?>

 

Atenciosamente

ShareMatrix

fsg

Felipe Sartori
avatar
Infante
Infante

INFOS

Grupo: InfanteRegistrado: 16/05/10Posts: 1510Char no Tibia: Alia Dori

Muito bom SharedMix, eu vou usar estou com um projeto e vou usar o código...

Rep+

Abraços.

Guarani da minha vida, a razão do meu viver, se ele jogasse lá no céu eu morreria só pra te ver! 1911 - 2015 ♥ 

sharematrix

avatar
Cavaleiro
Cavaleiro

INFOS

Grupo: CavaleiroRegistrado: 28/07/10Posts: 189Char no Tibia: Diahbo

Obrigado pelo REP+

Diogo

avatar
Visconde
Visconde

INFOS

Grupo: ViscondeRegistrado: 10/03/06Posts: 366

Explicando o script:

 

$server['host'] = 'underwar.org';
$server['port'] = '7171';

Define o IP e Porta para conectar.

 

$info = chr(6).chr(0).chr(255).chr(255).'info';

É como se fosse uma chave que é enviada ao servidor dizendo que você deseja informações dele.

 

$sock = @fsockopen($server['host'],$server['port'], $errno, $errstr, 1);

Aqui tenta-se criar uma conexão de socket com o servidor.

 

if ($sock) {

Se a conexão dá certo...

 

               fwrite($sock, $info);
               $data=''; 

Envia por socket a "chave" pedindo informações e inicia uma variável para receber a resposta.

 

               while (!feof($sock))
                   $data .= fgets($sock, 4096);
               fclose($sock);

Então vai fazendo leitura da resposta e guardando na variável iniciada ($data).

 

Essa resposta é um código XML.

 

Aqui o código recebido quando usei o script no Dark Operations Server:

 

<?xml version="1.0"?>
<tsqp version="1.0">
   <serverinfo uptime="1222296" ip="178.63.28.195" servername="Dark Operations" port="7171" location="Europe" url="http://Dark-Operations.net/" server="The Forgotten Server" version="0.4_SVN" client="8.62"/>
   <owner name="Dark-Operations.net" email="darkoperations.ot@gmail.com"/>
   <players online="72" max="1000" peak="198"/><monsters total="36937"/>
   <npcs total="337"/>
   <map name="map.otbm" author="Dark Operations owners" width="38000" height="38000"/>
   <motd>Welcome to the Dark Operations Server!</motd>
</tsqp>

 

Como podem ver, tem várias informações, como número de NPCs, e-mail para contato, versão do OTServ...

 

               preg_match('/players online="(\d+)" max="(\d+)"/', $data, $matches);
               $cnf_['players'] = 'Players: '.$matches[1].' / '.$matches[2].'';

Aqui o script usa RegEX para obter o número atual e máximo de players online, e depois guarda isso em uma variável.

 

               preg_match('/uptime="(\d+)"/', $data, $matches);
               $hour = floor($matches[1] / 3600);
               $minute = floor(($matches[1] - $h*3600) / 60);
               $cnf_['uptime'] .= $hour.'h '.$minute.'m';

Novamente uso do RegEX, dessa vez para obter o tempo que o servidor está online.

 

Dessa vez o script também realiza algumas operações para transformar o tempo, que vem em segundos, para minutos e horas.

 

               preg_match('/monsters total="(\d+)"/', $data, $matches);
               $cnf_['monsters'] .= $matches[1];

E para terminar, usa-se RegEX para pegar o número de monstros no servidor.

 

       }
       else
       {
               $cnf_['players'] .= '0 / 0';
               $cnf_['uptime'] = '0';
               $cnf_['monsters'] = '0 h 0 m';
       }

Depois, define valores zerados para os dados, caso o script não tenha conseguido realizar conexão lá no comecinho.

 

// Mostrando
echo $cnf_['players'];
echo $cnf_['uptime'];
echo $cnf_['monsters'];

E aqui mostra os dados!

 

Fim!

 

Vale lembrar que os OTServs só aceitam uma conexão a cada X segundos (acho que 3, 5 ou 10, não tenho certeza), por isso tem que guardar esses dados de alguma forma se quiser que não fique dando valores zerados.

 

Não sei se para conexões locais (o site no mesmo local que o otserv) também tem essa restrição de tempo.

Contato: não entre em contato

Halcor

avatar
Campones
Campones

INFOS

Grupo: CamponesRegistrado: 05/10/09Posts: 3
preg_match('/players online="(\d+)" max="(\d+)"/', $data, $matches);

 

Não é necessario utilizar preg_match só para isso, mais facil:

 

$XML = @simplexml_load_string($data);

if($XML){

print_r($XML);

return $XML;

}

 

Já ira vir todos os dados.

sharematrix

avatar
Cavaleiro
Cavaleiro

INFOS

Grupo: CavaleiroRegistrado: 28/07/10Posts: 189Char no Tibia: Diahbo

Lembrando que não fui eu que fiz o script, só arrumei alguns erros e postei aqui ;D

sharematrix

avatar
Cavaleiro
Cavaleiro

INFOS

Grupo: CavaleiroRegistrado: 28/07/10Posts: 189Char no Tibia: Diahbo

não sei de quem é :p, se alguem souber avisa ai