PHPit - PHP

"Agora, pois, permanecem a fé, a esperança, o amor, estes três; mas o maior destes é o amor." (I Coríntios 13:13)

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.

Código: Alternar entre o modo de cópia/destaque
  1. <?php
  2. // Nome do arquivo que será enviado para o usuário
  3. $arquivo = 'nome_do_arquivo.mp3';
  4.  
  5. // Velocidade máxima de download. Aqui exemplificado com 10,5 kb/s
  6. $velocidade = 10.5;
  7.  
  8. // Verifica se o arquivo existe e se ele é realmente um arquivo
  9. if(file_exists($arquivo) && is_file($arquivo)) {
  10. header('Cache-control: private');
  11. // Caso tenha problemas com a nomenclatura do arquivo na hora do download, remova a próxima linha
  12. header('Content-Type: application/octet-stream');
  13. header('Content-Length: '.filesize($arquivo));
  14. header('Content-Disposition: filename='.$arquivo);
  15.  
  16. // Esvazia o buffer de saída antes de começar a enviar
  17. flush();
  18. $arqAberto = fopen($arquivo, 'r');
  19. while(!feof($arqAberto)) {
  20. echo fread($arqAberto, round($velocidade*1024));
  21. flush();
  22. sleep(1);
  23. }
  24. fclose($arqAberto);
  25. }
  26. ?>
<?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($arqAbertoround($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!

Dim dim

 

Comentaí! (13)

Grande Jaques!!
Cara muito bom esses artigos!!

Grande abraço bruxo! Kuen em 12/04/2008 às 09:03 utilizando o Mozilla Firefox Mozilla Firefox 3.0b4 no Windows Windows XP
Cara, tri massa isso aí meu.. e simples! Xorna em 12/04/2008 às 12:56 utilizando o Mozilla Firefox Mozilla Firefox 2.0.0.13 no Windows Windows XP
Cara não testei seu script mas a idéia é muito boa parabéns! Anselmo Battisti em 13/04/2008 às 15:28 utilizando o Mozilla Firefox Mozilla Firefox 2.0.0.12 no Ubuntu Linux Ubuntu Linux
boa!,,,,,,,,,
ñ conhecia, mas é muito útil, dependendo do projeto.
abraço Luiz F. G. Deitos em 07/05/2008 às 18:10 utilizando o Mozilla Firefox Mozilla Firefox 2.0.0.12 no Windows Windows XP
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 André em 13/06/2008 às 17:35 utilizando o Mozilla Firefox Mozilla Firefox 2.0.0.14 no Windows Windows XP
É, 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 Andre em 18/06/2008 às 15:38 utilizando o Mozilla Firefox Mozilla Firefox 2.0.0.14 no Windows Windows XP
Esse script trava a página! Enquanto o download está sendo efetuado, não se consegue mais abrir nenhuma parte da página. Fernando em 07/05/2009 às 09:38 utilizando o Google Chrome Google Chrome 1.0.154.36 no Windows Windows XP
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. silverfox em 03/06/2009 às 17:32 utilizando o Flock Flock 2.0.3 no Windows Windows XP
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... Mateus em 19/06/2009 às 16:43 utilizando o Mozilla Firefox Mozilla Firefox 3.0.11 no Windows Windows XP
Mateus,

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

Assim que eu tiver alguma informação, posto aqui :) Rafael Jaques em 31/07/2009 às 10:47 utilizando o Mozilla Firefox Mozilla Firefox 3.5.1 no Mac OS Mac OS X
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? Gilberto Albino em 18/10/2009 às 15:05 utilizando o Opera Opera 9.80 no Windows Windows NT
q legal!!! Welito em 22/07/2010 às 14:10 utilizando o Mozilla Firefox Mozilla Firefox 3.0.5 no Windows Windows XP
testando... o bagui Weliton em 22/07/2010 às 14:12 utilizando o Mozilla Firefox Mozilla Firefox 3.0.5 no Windows Windows XP
 

Comenta logo, pô!

* Todos os links inseridos nos comentários possuem rel="nofollow" para impedir com que crawlers considerem os mesmos como relevantes.
* Os e-mails não são divulgados.

Dados pessoais

Você é realmente um humano?

Finalmente, digite seu comentário :)

Caixinha de Sugestões

O que é isso? Aqui você pode simplesmente digitar uma sugestão (artigos, resenhas, melhorias, etc) sem precisar preencher longos formulários. Digite o que quiser na caixinha abaixo e eu lerei com o maior prazer! Se quiser se identificar, fique a vontade!

O PHPit é redigido e mantido por Rafael Jaques - Política de Privacidade.

XHTML/CSS desenvolvido por André Gazola.

PHPit 2007 - 2009 - Alguns direitos reservados.

Feeds ;)

Creative Commons License

PHPit por Rafael Jaques é licensiado sob a Creative Commons Atribuição-Uso Não-Comercial-Compartilhamento pela mesma Licença 2.5 Brasil License.