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
<?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 // Caso tenha problemas com a nomenclatura do arquivo na hora do download, remova a próxima linha // Esvazia o buffer de saída antes de começar a enviar } } ?>
<?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!
PHP levado a sério