You get what you paid for

Limitando a velocidade de download de arquivos com PHP

08 de Junho de 2010 às 20:05 Edgar Serra PHP Sem comentários

Em alguma situações temos que utilizar artifícios para forçar o download de arquivos. Isso é necessário já que alguns arquivos serão tratados de forma diferente de acordo com as configurações do usuário.

Por exemplo: arquivos de MP3. De acordo com a configuração do usuário, ao se clicar em um link que aponte para um arquivo desse tipo, o mesmo pode abrir uma janela de download ou começar a tocar no media player.

Nesse contexto, usamos algum script para forçar o download, garantindo que em qualquer máquina o resultado do clique seja exatamente o mesmo. Mas e se quisermos limitar o download?

Em alguns casos, o limite de download se faz necessário para garantir que com um mesmo investimento, mais pessoas consigam acessar e baixar arquivos de um servidor. Uma maneira simples de ser limitar a velocidade é mostrada abaixo.

<?php

function limita_velocidade($arquivo,$velocidade_maxima){
      
        header('Cache-control: private');
        header('Content-Type: application/octet-stream');
        header('Content-Length: '.filesize($arquivo));
        header('Content-Disposition: filename='.$arquivo);
        flush();
        $arquivo_aberto = fopen($arquivo, 'r');

        while(!feof($arquivo_aberto)) {
            echo fread($arquivo_aberto, round($velocidade_maxima*1024));
            flush();
            sleep(1);
        }

        fclose($arquivo_aberto);
    
}

/*
O primeiro argumento da função limita_velocidade é o nome do arquivo que vai ser usado no download (no exemplo sis.zip)
O segundo argumento da função limita_velocidade é a velocidade máxima que deverá ser usada, no caso 5 representa 5kbp/s
*/
limita_velocidade('sis.zip','5');
?>

Em alguns casos, dependendo do servidor, os arquivos serão corrompidos, o que provavelmente ocorrerá é que o servidor encerre a execução do script. Nesse caso basta setar:
ini_set('max_execution_time', '0');

Para que o script não seja encerrado.

Também é bom ressaltar que variações de velocidade para mais e para menos durante a execução do script são normais, isso se deve a vários fatores, o importante é que a velocidade sempre estará próxima da que for definida.

Comentar:

Atenção: Todos os comentários são moderados, por isto não perca seu tempo postando bobagens ou spam.