Introdução
Esse artigo é uma incrementação do artigo "Criando um painel de rede em PHP", mas desta vez vamos mais à fundo nos recursos da linguagem,utilizando de suas funções de rede para verificar a integridade do servidor a um nível mais detalhado.
Nossa primeira versão do painel apenas verificava se uma máquina estava ativa na rede. Para tornarmos nosso aplicativo mais eficiente, vamos utilizar dos recursos de rede do PHP para verificar se o serviço desejado está ativo ou não. Muitas vezes um servidor passa a negar serviços de rede por algum motivo, mas continua respondendo a pacotes ICMP como se nada tivesse acontecido.
Para demonstrar a funcionalidade do painel, escolhi o serviço POP(Post Office Protocol) como alvo de nosso web-robot, por ser muito comum a queda do mesmo em servidores de rede (1).
(1) isso sem levar em conta as quedas do MS SQL Server quando executado em servidores menos robustos
Elaborando o script - parte 1
O primeiro passo na construção de nosso script será definir um cabeçalho usado para recarregar nosso script de tempos em tempos. Podemos fazer isso usando a tag meta do HTML:
<META HTTP-EQUIV="Refresh" CONTENT="60">
Neste caso, nosso script será recarregado a cada 60 segundos. Em seguida, vamos definir o array que contém a lista de servidores que será monitorada:<?
$servidores = array ("pop3.uol.com.br","pop.matrix.com.br","pop.ibest.com.br");
?>;
Neste exemplo utilizei endereços de servidores POP de provedores Internet,altere os mesmos para os servidores da sua empresa.
No bloco abaixo temos o coração do aplicativo. Utilizo uma estrutura de looping para percorrer cada máquina do array servidores, abrindo uma conexão TCP na porta 110 (2) com a mesma. Aproveitei do recurso de tabelas do HTML para melhorar a formatação da saída do programa.
(2) por definição, o serviço POP sempre é executado na porta 110 de um servidor
<?
while (list($chave,$servidor) = each($servidores)) {
$stream = fsockopen ($servidor, 110, $errono, $errostr, 30);
echo "<td>".$servidor."<br>"."Status:";
if ($stream) {
echo "<b>Ativo</b></td>";
} else {
echo "<font color=red>" . $errostr . "</font></td>";
}
}
?>
Na linha:
$stream = fsockopen ($servidor, 110, $errono, $errostr, 30);
A variável $stream armazena a conexão com o servidor em questão. O comando fsockopen se conecta à porta 110 de $servidor, em caso de erro durante a conexão, o número e a descrição do mesmo são respectivamente armazenadas em $errorno e $errorstr. O tempo de espera para a realização de conexão é de 30 segundos.
Seguindo a lógica do programa, se a variável $stream possuir um valor VERDADEIRO, sabemos que o servidor está aceitando conexões, caso contrário,mostramos a mensagem do erro ocorrido na tela.
<?
if ($stream) {
echo "<b>Ativo</b></td>";
} else {
echo "<font color=red>" . $errostr . "</font></td>";
}
?>
Elaborando o script - parte final
Agora que todas as partes do nosso programa foram explicadas, vamos unificar nossos blocos para formar nosso aplicativo.<!-- painelPOP.php -->
<html>
<head>
<META HTTP-EQUIV="Refresh" CONTENT="60">
</head>
<body>
<h3>Painel de Monitoramento de Servidores de Email</h3>
<table border=1 cellspacing=3>
<tr>
<?
$servidores = array ("pop3.uol.com.br","pop.matrix.com.br");
while (list($chave,$servidor) = each($servidores)) {
$stream = fsockopen ($servidor, 110, $errono, $errostr, 30);
echo "<td>".$servidor."<br>"."Status:";
if ($stream) {
echo "<b>Ativo</b></td>";
} else {
echo "<font color=red>" . $errostr . "</font></td>";
}
}
?>
</tr>
</table>
</body>
</html>