Limitando a velocidade de download de um arquivo

Prefácio

Seguindo a linha do último artigo, agora criaremos um sistema para limitar a velocidade do cabra quando ele estiver fazendo o download.

Isso é bom para sites com grande volume de tráfego onde você não quer afogar a banda do servidor.

E então você me pergunta: “Como limitar a velocidade de um download com PHP?”

Conceito

Para esta experiência, utilizaremos um cálculo simples.
A idéia é não enviar o arquivo diretamente para o usuário, e sim enviar para o buffer em uma velocidade constante, estipulando a velocidade máxima com que o usuário irá receber os dados.

A idéia pode parecer um pouco complexa mas a implementação é simples!

Mão na massa

Vamos criar duas variáveis: $arquivo e $velocidade. Elas irão armazenar o nome do arquivo que será baixado e a velocidade máxima de download em kbps, respectivamente.

<?php
	// Nome do arquivo que será enviado para o usuário
	$arquivo = 'nome_do_arquivo.mp3'; 

	// Velocidade máxima de download. Aqui exemplificado com 10,5 kb/s
	$velocidade = 10.5; 

	// Verifica se o arquivo existe e se ele é realmente um arquivo
	if(file_exists($arquivo) && is_file($arquivo)) {
		header('Cache-control: private');
		// Caso tenha problemas com a nomenclatura do arquivo na hora do download, remova a próxima linha
		header('Content-Type: application/octet-stream');
		header('Content-Length: '.filesize($arquivo));
		header('Content-Disposition: filename='.$arquivo);

		// Esvazia o buffer de saída antes de começar a enviar
		flush();
		$arqAberto = fopen($arquivo, 'r');
		while(!feof($arqAberto)) {
			echo fread($arqAberto, round($velocidade*1024));
			flush();
			sleep(1);
		}
		fclose($arqAberto);
	}
?>

A implementação segue a mesma idéia dos outros artigos escritos anteriormente. Um script PHP que gerencia o download do usuário.

Conclusão

Embora você possa experimentar alguma flutuação da taxa de download (alguns bits de diferença), o script irá se encarregar de enviar para o usuário os dados na velocidade correta!

Se possível: comente, entre em contato, mande sugestões…
É sempre bom saber o que vocês estão pensando!

E peço que me perdoem pela demora em postar mais colunas!

Um forte abraço e fiquem com Deus!

Esta entrada foi publicada em Dicas e marcada com a tag , , . Adicione o link permanente aos seus favoritos.

13 pessoas já comentaram! Tá esperando o quê?

  1.  
    Kuen disse:

    Grande Jaques!!

    Cara muito bom esses artigos!!

    Grande abraço bruxo!

    Utilizando Mozilla Firefox Mozilla Firefox 3.0b4 no Windows Windows XP
  2.  
    Xorna disse:

    Cara, tri massa isso aí meu.. e simples!

    Utilizando Mozilla Firefox Mozilla Firefox 2.0.0.13 no Windows Windows XP
  3.  

    Cara não testei seu script mas a idéia é muito boa parabéns!

    Utilizando Mozilla Firefox Mozilla Firefox 2.0.0.12 no Ubuntu Linux Ubuntu Linux
  4.  
    Luiz F. G. Deitos disse:

    boa!,,,,,,,,,

    ñ conhecia, mas é muito útil, dependendo do projeto.

    abraço

    Utilizando Mozilla Firefox Mozilla Firefox 2.0.0.12 no Windows Windows XP
  5.  
    André disse:

    Excelente post, mas fui testar aqui, o arquivo veio corrompido, notei que ele roda em torno de 20segundos e dá como download concluído, será que é apenas aqui que isto ocorre? parabéns pelos posts, são de altíssima qualidade, estou pegando este site como referencia

    Utilizando Mozilla Firefox Mozilla Firefox 2.0.0.14 no Windows Windows XP
  6.  
    Andre disse:

    É, tava tentando aqui e o script cortava no meio, me veio a cabeça do script ser executado por apenas 30s, no caso em alguns servidores pode-se utilizar o ini_set('max_execution_time', '0'); que o script não terá mais tempo máximo de execução… dá certinho, funciona perfeitamente parabéns novamente pelo post

    Utilizando Mozilla Firefox Mozilla Firefox 2.0.0.14 no Windows Windows XP
  7.  
    Fernando disse:

    Esse script trava a página! Enquanto o download está sendo efetuado, não se consegue mais abrir nenhuma parte da página.

    Utilizando Google Chrome Google Chrome 1.0.154.36 no Windows Windows XP
  8.  
    silverfox disse:

    nossa incrivel ideia, ainda não testei, mas gostaria que na internet tive-se mais exemplos "SUPER UTEIS", eu sempre encontro exemplos uteis, mas super é dificil.

    Parabens.

    Utilizando Flock Flock 2.0.3 no Windows Windows XP
  9.  
    Mateus disse:

    opa…amigo, no meu caso, eu preciso ir verificando a quantidade de kbytes enviados para a maquina do cliente, e durante todo o processo de download vou comparar estas informações com o tamanho total do arquivo, para que quando o download chegue ao final, eu vou ter certeza que o cliente baixou todo o download… como posso resgatar esta informação sobre o tanto q foi baixado…

    Utilizando Mozilla Firefox Mozilla Firefox 3.0.11 no Windows Windows XP
  10.  
    Rafael Jaques disse:

    Mateus,

    Infelizmente eu ainda não consegui descobrir um jeito de fazer isso…

    Assim que eu tiver alguma informação, posto aqui :)

    Utilizando Mozilla Firefox Mozilla Firefox 3.5.1 no Mac OS X Mac OS X 10
  11.  

    Muito útil para quem precisa limitar a banda do site, principalmente blogs que postam vídeos próprios.

    Acho que dava para criar uma função ou uma classe para deixar mais pratico, não?

    Utilizando Opera Opera 9.80 no Windows Windows 7
  12. Utilizando Mozilla Firefox Mozilla Firefox 3.0.5 no Windows Windows XP
  13.  
    Weliton disse:

    testando… o bagui

    Utilizando Mozilla Firefox Mozilla Firefox 3.0.5 no Windows Windows XP

Deixe um Comentário

O seu endereço de email não será publicado Campos obrigatórios são marcados *

*

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">