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>

A página de resultado

A página de resultado também 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, já começamos alguns cálculos.

4... A variável $kbps é inicializada com o valor kbps enviado como parâmetro através do método "GET" fazendo-se a leitura do elemento 'kbps' do array $_GET. Com isto temos os kilobits por segundo, lidos na página anterior, arredondados com duas casas decimais.

Os cálculos seguintes apenas transformam as unidades. $ksec corresponde ao número de kilobytes lidos (1 byte = 8 bits), $mbps corresponde ao número de megabits lidos (1 megabit = 1024 bits) e $msec corresponde ao número de megabytes lidos (1 byte = 8 bits).

5... Se o número de megabits lidos for maior do que 1, formatamos o valor como número flutuante de duas casas decimais e o imprimimos com printf ("%.2f",$mbps); seguido de mais uma saída para a tela de echo " Mbps<br><br>;" para especificar a grandeza. Se o número de megabits for menor do que 1, procede-se da mesma maneira com o valor dos kilobits.

6... Depois de apresentar o total de kilo ou megabits lidos, mostramos o volume lido por segundo. Usando echo, se $msec for maior do que 1, mostramos o valor dos megabytes por segundo; se não, mostramos o valor dos kilobytes por segundo.

	<php?
4...	   $kbps = round($_GET['kbps'], 2);
	   $ksec = round($kbps / 8, 2);
	   $mbps = round($kbps / 1024, 2);
	   $msec = round($mbps / 8, 2);

5...	   if ($mbps > 1) {
	      printf ("%.2f",$mbps); 	
	      echo " Mbps<br><br>";
	   } else {
	      printf ("%.2f",$kbps); 	
	      echo "kbps<br><br>";
	   }

6...	   if ($msec > 1) {
	      echo " significando downloads a " . $msec .
	           " MB/seg. do meu servidor.";
	   } else {
	      echo " significando downloads a " . $ksec .
	           " KB/seg. do meu servidor.";
	   }
	?>

7... A seguir, montamos uma tabela comparativa. Neste ponto, o PHP será responsável não só pelos cálculos como ainda pelo código HTML. Em HTML puro delimitamos a área da tabela com <table> e </table>. O miolo da tabela, ou seja, os <tr> e os <td>, serão gerados através do PHP. O código HTML gerado pelo PHP está destacado em azul.

8... Inicialmente criamos um array cujos elementos recebem uma chave com os valores das velocidades nominais. A cada um destes elementos nominados atribui-se um sub-array que contém dois elementos nominados (chaves "nome" e "imagem") e seus respectivos valores. O primeiro elemento do array, nominado "28.8", possui um sub-array com o elemento "nome", cujo valor é "dial-up", e o elemento "imagem", cujo valor é "1.gif". Este array, chamado de $serviços, será utilizado para gerar o gráfico de velocidades dentro da tabela.

9... Para manter as proporções das barras dos gráficos de acordo com os valores que serão apresentados, é preciso determinar a escala das barras. Comparamos o maior valor do array com o valor obtido e, de acordo com o resultado, armazenamos o valor da escala na variável $escala_barra.

10... A partir daí é só ir jogando os valores nas colunas da tabela de acordo com o array $serviços. É óbvio que neste array não consta o valor do teste de conexão. Este precisa ser comparado com os valores padrão estabelecidos no array e ser inserido no local correto. Para ir percorrendo o array, fazemos uso de um loop foreach, no qual extraímos cada chave com array_keys($servicos) e atribuímos este valor à variável $servico.

A cada passo do loop foreach, passamos os valores do nome e da imagem correspondente para as variáveis $nome e $imagem. Além disso, de acordo com $servico, calculamos o comprimento da barra correspondente e armazenamos o valor na variável $tam_barra. Assim, no primeiro passo, quando $servico="28.8", obtemos $nome="dial-up", $imagem="1.gif" e $tam_barra=7,6896. Quando $servico="384", temos $nome="DSL", $imagem="3.gif" e $tam_barra=102,528... e assim sucessivamente.

11... Só precisamos controlar quando devemos inserir o valor calculado para o usuário. Digamos que o valor encontrado seja 287. Neste caso, quando $servico=384, temos a primeira ocorrência de um valor maior que o calculado. Isto pode ser testado através da diretiva condicional if ($servico > $kbps). Acontece que todos os passos posteriores terão valores armazenados em $servico que também serão maiores que o calculado. Para imprimir o valor do usuário apenas uma vez (e não 4 vezes), fazemos uso de uma variável adicional que nos indicará se o valor do usuário já foi impresso: a variável $a_sua. Como a variável foi declarada diretamente na diretiva if e nenhum valor lhe foi atribuído, ela automaticamente recebe o valor FALSE e, enquanto for falsa, nos indica que o valor do usuário ainda não foi apresentado.

A diretiva if completa passa então a ser if (($servico > $kbps) && $a_sua == False) que, traduzido, é "se $servico for maior que $kbps E $a_sua for falso". Se esta condição for preenchida, antes de jogar para a tela os valores do array, imprimimos o valor calculado para o usuário com vários echo e, no final, passamos a variável $a_sua para verdadeiro. No próximo passo do loop, apesar de $servico > $kbps, o valor do usuário não será impresso novamente.

12... A cada passo do loop, independentemente do valor calculado para o ussário, imprimimos a barra correspondente do serviço. Além disso, terminamos a área PHP e fechamos a tag da tabela com </table>.

7...	<table>

	<?php

8...	$servicos = array(
	   "28.8" =>  array ( "nome" => "dial-up", "imagem" => "1.gif" ),
	   "33.6" =>  array ( "nome" => "dial-up", "imagem" => "1.gif" ),
	   "53.3" =>  array ( "nome" => "dial-up", "imagem" => "1.gif" ),
	   "56" =>    array ( "nome" => "ISDN", "imagem" => "2.gif" ),
	   "128"  =>  array ( "nome" => "ISDN", "imagem" => "2.gif" ),
	   "384"  =>  array ( "nome" => "DSL", "imagem" => "3.gif" ),
	   "768"  =>  array ( "nome" => "DSL", "imagem" => "3.gif" ),
	   "1000"  => array ( "nome" => "DSL", "imagem" => "4.gif" ),
	   "1500"  => array ( "nome" => "DSL/T1/Cable Modem", "imagem" => "5.gif" )
	);

9...	if ($kbps > 1500) {
	   $escala_barra = 400/$kbps;
	} else {
	   $escala_barra = 0.267;
	}

10...	foreach(array_keys($servicos) as $servico) {

	   $nome = $servicos[$servico]["nome"];
	   $imagem = $servicos[$servico]["imagem"];
	   $tam_barra = $servico * $escala_barra;

11...	   if (($servico > $kbps) && $a_sua == False) {
	      $tam_barra = $kbps * $escala_barra;
	      $alt_sua_barra = $alt_barra + 5;
	      echo "<tr>\n";
	      echo "<td align=left><b>$kbps kbps</b></td>\n";
	      echo "<td align=center><b>VOCÊ</b></td>\n";
	      echo "<td align=left><img src=$graf_usuario
	            height=$alt_barra width=$tam_barra></td>"; 
	      echo "</tr>\n";
	      $a_sua = True;
	   }

12...	   echo "<tr>\n";
	   echo "<td align=left>$servico kbps</td>\n";
	   echo "<td align=center>$nome</td>\n";
	   echo "<td align=left><img src=$imagem height=$alt_barra
		width=$tam_barra></td>"; 
	   echo "</tr>\n";
	}

	if ($a_sua == False) {
	   $tam_barra = $kbps * $escala_barra;
	   $alt_sua_barra = $alt_barra + 5;
	   echo "<tr>\n";
	   echo "<td align=left><b>$kbps kbps</b></td>\n";
	   echo "<td align=center><b>VOCÊ</b></td>\n";
	   echo "<td align=left><img src=$graf_usuario
	        height=$alt_sua_barra width=$tam_barra></td>"; 
	   echo "</tr>\n";
	}

	?>

	</table>


Medidor de Largura de Banda da Aldeia

Se você quiser fazer um teste, use o Medidor de Largura de Banda da Aldeia.

Fonte

Copyright 2002 (C) Gambit Design Internet Services (Licença Pública GNU)

Autor: Derek T. Del Conte - derek arroba gambitdesign ponto com

Este texto foi baseado na fonte acima. Veja a versão original em Bandwidthmeter, onde também é possível fazer o download da versão mais atualizada.

mfx brokernikas харьковлобановский александр интервью биолмужская косметичкакупить сантехнику +в москве недорого полигон

Informações adicionais