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!
Grande Jaques!!
Cara muito bom esses artigos!!
Grande abraço bruxo!
Cara, tri massa isso aí meu.. e simples!
Cara não testei seu script mas a idéia é muito boa parabéns!
boa!,,,,,,,,,
ñ conhecia, mas é muito útil, dependendo do projeto.
abraço
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
É, 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
Esse script trava a página! Enquanto o download está sendo efetuado, não se consegue mais abrir nenhuma parte da página.
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.
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,
Infelizmente eu ainda não consegui descobrir um jeito de fazer isso…
Assim que eu tiver alguma informação, posto aqui :)
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?
q legal!!!
testando… o bagui