SH
php

Verificar Status Em Php

Por sharematrix, 10 de dez. de 2010 em Programação Web

script
8
2.9k
sharematrixS
10 de dezembro de 2010 às 15:00

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

fsgF
15 de dezembro de 2010 às 13:21

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

Rep+

Abraços.

sharematrixS
18 de dezembro de 2010 às 00:56

Obrigado pelo REP+

DiogoD
18 de dezembro de 2010 às 19:56

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.

1 mês depois...
HalcorH
23 de janeiro de 2011 às 01:45
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.

sharematrixS
23 de janeiro de 2011 às 05:27

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

noobinhuN
24 de janeiro de 2011 às 10:32

então coloque os créditos.

sharematrixS
24 de janeiro de 2011 às 22:40

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