Montando um velocímetro de internet com PHP e GD

Neste artigo veremos os passos necessários para a criação de uma página de teste de desempenho/velocidade de sua conexão com a internet utilizando PHP, GD, HTML e javascript.

[ Hits: 126.432 ]

Por: Kemper Alves em 04/07/2007


A página desempenho.php



Esta é a página que fará o trabalho de enviar as informações, calcular a velocidade e apresentar o resultado na tela. Como já expliquei no início, o funcionamento e o código está comentado, não vou me prender muito a explicações aqui.

Arquivo: desempenho.php

<?
   /*
      TIPO DE LICENÇA: GNU/GPL

      TESTE DE DESEMPENHO EM PHP
      AUTOR: KEMPER ALVES DE CASTRO CARLOS <kemper@omegacodigos.com.br>

   */


?>
<html>
<head>
   <title>Teste de Desempenho</title>
</head>
<body style="margin-left:100px;margin-right:100px;margin-top:10px">
   <div style="width:100%; border-style:solid; border-color:rgb(200,200,200); border-width:1px">
      <h1 id=titulo>Teste de Desempenho</h1>
      <p><b>Atenção:</b> Feche qualquer programa que esteja utilizando a conexão antes de iniciar o teste!</script>
      <p id=aguarde style="text-align: center; color: blue; font-weight: bold">Aguarde enquanto o teste é efetuado!</p>
   <div id=barraprogresso style="width:96%;left: 2%; position: relative; border-style:solid; border-color:rgb(200,200,200); border-width:1px; margin-bottom:3px">
      <hr align=left style="width:0%; height:20px; border-style: none; background-color:blue;" id=barra>
   </div>
<?
   /*
      Aqui definimos qual a quantidade de kbytes
      será utilizada no teste,
      Utilizo 256 porque é o que mais faz o resultado
      se aproximar da verdade.
      Valores muito altos consomem muita cpu, provocando
      atraso no processamento e consequentemente, perda de precisão.
      valores muito baixos a transferência ocorre muito rapidamente,
      provocando também baixa precisão no resultado.
   */


   $tamanho=256;
   $tamanho=1024*$tamanho;


   /*
      Agora vamos gerar uma string com a quantidade de dados necessário.
      Note que a string é aleatória para evitar que o browser do
      usuário armazene no cache.
      Veja também que a cada 256 bytes é escrito o código que atualiza
      a barra de progresso, e, logicamente, a quantidade de bytes
      utilizado por esse código é descontado, pois ele vai junto da
      string de 256K, assim continuamos enviando dados e atualizamos a barra
      de progresso ao mesmo tempo  :)
   */


   for ($i=0; $i<$tamanho; $i++){
      if ($i % 256 == 0){
         $addstr="--> <script>";
         $addstr.="document.getElementById(\"barra\").style.width=\"".number_format(100/$tamanho*$i,0)."\%\";";
         $addstr.="</script><!-- ";
         $i+=strlen($addstr);   //é a quantidade de caracteres gastos para atualizar a barra
         $str.=$addstr;
      }else{
         //Gera uma string aleatória, para evitar cache dos navegadores
         $str.=chr(rand(97, 97+20));
      }
   }
?>


<?
   /*
      O script abaixo exibe a frase "aguarde o fim do teste!"
      e armazena o momento exato do início do teste...
   */

?>
<script>
   document.getElementById("aguarde").innerHTML="Aguarde o fim do teste!";
   time=new Date();
   starttime=time.getTime();
</script>

<?
   /*
      AGORA É TRANSFERIDA A STRING GERADA PARA O BROWSER DO USUÁRIO,
      LEMBRE-SE, ELA POSSUI 256 KBYTES E ESTÁ INCLUÍDO O CÓDIGO
      JAVASCRIPT PARA ATUALIZAR A BARRA DE PROGRESSO.
   */

?>

<!-- <? echo $str ?> -->

<?
   /*
      PRONTO! TRANSFERÊNCIA CONCLUÍDA!

      AGORA ARMAZENA A HORA QUE CONCLUIU, CALCULA A TAXA DE
      TRANSFERÊNCIA E CHAMA O SCRIPT:

      grafico_desempenho.php

      PARA GERAR O RESULTADO...
   */

?>

<script>
   time = new Date();
   endtime = time.getTime();
   if (endtime == starttime) {
      downloadtime = 0;
   } else {
      downloadtime = (endtime - starttime);
   }

   kbits = <?echo $tamanho?>*8;
   kbitssegundo = kbits/downloadtime;

   document.getElementById("aguarde").innerHTML="<a href=desempenho.php>Obtendo o Gráfico</a>";
   document.getElementById("titulo").innerHTML="Teste de Desempenho Concluído";
   document.getElementById("barraprogresso").innerHTML="";
   document.getElementById("barraprogresso").style.borderStyle="none";

   //AQUI É DESENHADO O GRÁFICO DA VELOCIDADE...
   document.write("<p align=center><img align=center src=grafico_desempenho.php?velocidade="+kbitssegundo+"></p>");
   document.getElementById("aguarde").innerHTML="<a href=desempenho.php>Testar Novamente</a>";
</script>
</div>
</body>
</html>

EOF!

Download: desempenho.txt

Página anterior     Próxima página

Páginas do artigo
   1. Entendendo o Funcionamento
   2. O que é necessário
   3. A página desempenho.php
   4. O script grafico_desempenho.php
   5. Publicando
Outros artigos deste autor

Montando um sistema Helpdesk com servidor Linux e Java em um ambiente corporativo ou na Internet

Instalando o Ultra Servidor no Debian Lenny

Instalando o novo Anjuta 2.2.0 no Ubuntu Feisty

Montando um Debian Etch - Para técnicos

Backup fácil de seus arquivos com o Backintime

Leitura recomendada

Asterisk - Monitorando ligações gravadas através de página em PHP

Consultando servidores SNMP com PHP

Monitoramento de banda em TEMPO REAL com gráfico utilizando BWBAR + PHPLOT

Script PHP/MySQL - Controle de Máquinas via MAC Address no IPtables

Alterando quotas via PHP (navegador)

  
Comentários
[1] Comentário enviado por pankdo em 04/07/2007 - 10:36h

bom artigo gostei muito
mas estou tendo um probleminha
nao estou conseguindo gerar a imagem
o q q eu posso fazer

[2] Comentário enviado por m4rc310 em 04/07/2007 - 10:41h

Muito bom, gostei.
Entretando a velocidade medida será específica para o meio entre seu servidor e sua máquina fazendo download certo? Você estará medindo a velocidade da sua rede em questão.

Eu só conheço o www.numion.com/yourspeed para testar a as velocidades escolhendo países. Porém o teste é só pra navegação e não para grandes downloads.

Alguém conhece uma solução melhor e mais genérica?

[3] Comentário enviado por kemperacc em 05/07/2007 - 00:23h

pankdao_dj:

Qual erro esta acontecendo?

No chute, pode ser que o GD nao estah instalado no seu servidor.

Outra coisa, me passa a url depois de pronto pra eu ver...

[4] Comentário enviado por kemperacc em 05/07/2007 - 00:25h

marcelonovol:

Exatamente, a velocidade eh medida entre o meu servidor Web e o Meu cliente, visto que eu sou um provedor de internet, este teste atende totalmente as minhas necessidades.

[5] Comentário enviado por shocker em 05/07/2007 - 09:22h

Bem bacana mesmo! Parabéns! =)

[6] Comentário enviado por removido em 05/07/2007 - 23:07h

Boa noite. Estou testando o script em minha maquina mas a conexao não esta sendo medida de forma correta. Quando visualizo os logs em /var/log/apache/error_log ele me retorna a seguinte menssagem:

[Thu Jul 5 22:59:25 2007] [error] PHP Notice: Undefined variable: velocidade in /var/www/htdocs/grafico_desempenho.php on line 47
[Thu Jul 5 22:59:25 2007] [error] PHP Notice: Undefined variable: velocidade in /var/www/htdocs/grafico_desempenho.php on line 13

Voce tem alguma ideia?
http://shamira.no-ip.org:8082/desempenho.php

[7] Comentário enviado por kemperacc em 06/07/2007 - 09:21h

OK, o script desempenho.php nao esta recebendo a variavel velocidade, tente fazer o seguinte:

1) Abra o arquivo de configuracao do php, no debian eh:

/etc/phpX/apace/php.ini (X eh a versao do php)

2) Localize a linha:

register_globals = Off

3) mude para On

register_globals = On

4) Reinicie o apache.

OBS - Mudar o register_globals para On eh uma potencial falha de seguranca, ha uma outra forma de passar a variavel, vou pesquisar e posto aqui.


[8] Comentário enviado por alexandrecorrea em 06/07/2007 - 11:13h

ativar o register_globals pode ser 'fatal' em alguns casos.. pois todas as variaveis se tornam globais..

para resolver este problema... basta editar o grafico_desempenho.php e mudar a linha

$velo=$velocidade;

para

$velo=$_GET['velocidade'];

:)

[9] Comentário enviado por edusierra em 07/07/2007 - 16:44h

Pessoal.... alguém conhece um esquema para teste de upload?

[10] Comentário enviado por kemperacc em 10/07/2007 - 14:02h

oi alexandrecorrea,

Obrigado pela correcao, este script era antigo meu e eu deixei passar batido.

[]s

Kemper

[11] Comentário enviado por marceloespindola em 11/07/2007 - 17:38h

Pessoal eu montei um desses medidor, mas em flash muito mais fácil de construir justamente por está pronto para mais detalhes visite o site no seguinte link: http://marcelolinux.blogspot.com/2007/07/tenha-seu-prprio-velocmetro-em-flash.html

A vantagem dele como sempre do flash é possui a facilidade enorme de instalar e colocar para funcionar em qualquer sistema operacional e com a compatibilidade em praticamente qualquer navegador, bastando apenas copiar os arquivos em flash para qualquer pasta acessível pelo servidor web.

[12] Comentário enviado por iandecy em 30/07/2007 - 22:23h

como faço para instalar isso no meu servidor ? para poder testar a minha propria conexao ?

quem souber me ajuda por favor.

[13] Comentário enviado por comfaa em 28/10/2008 - 13:01h

muito legal !!!

[14] Comentário enviado por paulocamboim em 09/02/2009 - 18:43h

Muito bom!
Parabens!

[15] Comentário enviado por Byfred em 12/09/2009 - 01:00h

Muito bom o script, mas com um pequeno problema,

o Internet Explorer primeiro está carregando todos os dados para depois exibi-los, ou seja, o tempo de "start" e "stop" está praticamente o mesmo, isso está fazendo o resultado ficar absurdamente grande, ou algumas vezes aparece "infinity",

Com Firefox e Chorme funcionou perfeitamente...
Aqui está o site para teste:

http://www.testesuanet.com

Alguem tem a solução ?

[16] Comentário enviado por kilson em 23/02/2010 - 17:24h

Muito bom artigo. Ótimo script.
Parabéns! E obrigado por publicar.

[17] Comentário enviado por removido em 23/02/2010 - 18:33h

Muito bom..Teria como colocar para o grafico ser exibido em um pop-up ? ficaria legal.

[18] Comentário enviado por tarcisiowill em 22/09/2010 - 17:35h

O teste tá retornando com a velocidade 0 KBs, pq? O que tá errado?

[19] Comentário enviado por andreontherock em 11/02/2011 - 01:18h

no meu diz que a imagem não pode ser exibida, deve ter algum erro

[20] Comentário enviado por kemperacc em 11/02/2011 - 07:21h

Sim, provavelmente o GD não está instalado.

[21] Comentário enviado por luancfalquetto em 30/05/2011 - 15:15h

apesar de o tópico estar parado a um tempo...
existe alguma forma de usar um arquivo com tamanho maior? tipo uns 3MB?

[22] Comentário enviado por kemperacc em 30/05/2011 - 16:07h

Sim, altere no arquivo desempenho.php a linha:

$tamanho=256;

para o tamanho que voce quiser, exemplo:

$tamanho = 30192;

[23] Comentário enviado por lndr.simon em 11/04/2012 - 09:05h

mt bom. salvando para usar futuramente


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts