A Aldeia Numaboa ancestral ainda está disponível para visitação. É a versão mais antiga da Aldeia que eu não quis simplesmente descartar depois de mais de 10 milhões de pageviews. Como diz a Sirley, nossa cozinheira e filósofa de plantão: "Misericórdia, ai que dó!"

Se você tiver curiosidade, o endereço é numaboa.net.br.

Leia mais...

Informática Numaboa - Tutoriais e Programação

Medindo a largura de banda *

Sab

11

Nov

2006


22:29

(33 votos, média 4.88 de 5) 


Nível avançado Medir a velocidade de conexão é interessante tanto para usuários quanto para provedores de serviço e webmasters. Além disso, também é interessante explorar alguns aspectos menos usuais da programação web. Este tutorial mostra como medir a largura de banda de uma conexão usando PHP e JavaScript, uma associação muito prática e eficiente. Os testes são efetuados tanto para as conexões discadas quanto para as de banda larga.

O autor do texto que serve de base para este tutorial informa que também se baseou num código ASP fornecido por um usuário da inet-access mailing list e que desconhece sua origem.

Neste tutorial, o código descrito é apresentado nas áreas claras. A numeração 1..., 2..., 3... NÃO faz parte do código e está destacada em vermelho. Serve apenas para associar o trecho do código ao texto explicativo.

Entendendo o projeto

O projeto é constituído por uma página HTML, na qual são inseridas rotinas em PHP que fazem a leitura de um arquivo qualquer. A velocidade de leitura é obtida através do cálculo do número de bytes lidos num determinado intervalo de tempo. Os valores obtidos são usados para se chamar uma segunda página HTML que apresenta os resultados.

Resumindo: o projeto é composto por um arquivo de leitura e duas páginas HTML + PHP + JavaScript.

O arquivo de leitura

O arquivo de leitura precisa ser relativamente grande para permitir a leitura de uma grande quantidade de bytes num tempo significativo que facilite os cálculos (é mais fácil lidar com 10 do que com 0,0000000001). O conteúdo do arquivo não será processado, portanto, é irrelevante. No nosso exemplo, o arquivo possui cerca de 3.8 Mega. Você pode fazer o upload de qualquer arquivo que tenha mais de 3 mega para o mesmo diretório onde você escolheu salvar a página de leitura e a página de resultado e renomeá-lo para teste.bin.

A página de leitura

A página de leitura possui a estrutura clássica de uma página HTML com <html><head></head><body></body></html>. Após o texto habitual de identificação do assunto da página, inserimos um pequeno script JavaScript para obtermos a hora e armazenamos o resultado na variável horaIni:

<script>
<!--
   hora    = new Date();
   horaIni = hora.getTime();
// -->
</script>

Logo a seguir começa o código PHP responsável pela leitura do arquivo que denominaremos teste.bin. O manipulador de arquivo $fd abre o arquivo apenas para leitura (r), forçando uma leitura binária (b). Depois disto, o conteúdo binário do arquivo obtido através da leitura de 512 * 1024 bits com fread é armazenado na variável $conteudo. O número de bits lidos foi fixado em 512 * 1024 apenas para garantir um número significativo de bits. Terminada a leitura, o conteúdo lido é transferido para a página numa área invisível (delimitada por <!-- e -->) para determinar o tempo de escrita. Terminado o processo, fecha-se o manipulador com fclose.

<?php
   $fd = fopen ("teste.bin, "rb");
   $conteudo = fread ($fd, 512 * 1024);
   echo "<!-- $conteudo -->";
   fclose ($fd);
?>

1... Depois disto usamos um novo JavaScript, este um pouco mais elaborado. Obtemos novamente a hora, armazenamos o resultado na variável horaFim e comparamos as horas inicial e final. Caso sejam iguais, o tempo de leitura (ou download de bits do arquivo teste.bin) foi zero; caso sejam diferentes, o tempo de download corresponde à diferença dos dois horários em segundos, que será dividido por 1000 para serem expressos em milissegundos. Qualquer que seja o resultado, ele é armazenado na variável tempoDown.

2... Tendo o tempo de leitura, dividimos o volume de dados pelo tempo gasto e armazenamos o resultado na variável velocidade. A seguir, transformamos os bytes por segundo em kilobits por segundo ou kbps: arrendondamos a multiplicação da velocidade por 8 (cada byte possui 8 bits) e por 1024 para transformá-la em kilo (no sistema binário kilo corresponde a 210 e 2 elevado a 10 é igual a 1024). A multiplicação e posterior divisão por 10 se anulam. Isto é utilizado apenas para se obter uma casa decimal no resultado final.

3... Com estes dados é possível calcular a velocidade de transmissão de acordo com a largura de banda disponível. Este cálculo será realizado na segunda página do projeto. A página de resultado, também em PHP (resultado.php), espera alguns parâmetros. Para isto compomos uma string, proxPage, que contenha a chamada de resultado.php seguida das variáveis e seus valores: "resultado.php?kbps=" + kbps + "&tempo=" + tempoDown + "&KB=" + kbytes_de_dados. Esta string será o valor passado para document.location.href, que acionará a leitura de resultado.php.

        <script>
	<!--
1...	   hora          = new Date();
	   horaFim       = hora.getTime();
	   if (horaFim == horaIni)
	      {tempoDown = 0}
	   else
	      {tempoDown = (horaFim - horaIni)/1000;}

	   kbytes_de_dados = 512 * 1024;
2...	   velocidade      = kbytes_de_dados/tempoDown;
	   kbps            = (Math.round((velocidade*8)*10*1.024))/10;

3...	   proxPage = "resultado.php?kbps=" + kbps +
	              "&tempo=" + tempoDown + "&KB=" + kbytes_de_dados;
	   document.location.href=proxPage
	// -->
	</script>

Informações adicionais