New question

Question:

Date: 21-03-2015 20:59:37 (In Spanish)

Limitar la velocidad de descarga de archivos. No me funciona[Resolved]

Jugando con php.
He estado viendo en php.net y vi unas cosas interesantes que quise probar, haciendo unas pequeñas variantes
Se trata de un codigo que limitaría la velocidad de descarga de un archivo a un numero de kbyte, etc

este es el link en cuestion. Readfile
Usando parte de los header propuesto y con el comentario en ese mismo post de chrisputnam

Convergí todo en este script

$tamanoMaximo es el maximo de descarga en megabyte


<?php

$local_file="archivo_local.rar"; // nombre del archivo local
$download_file="archivo_descargado.rar"; // nombre del archivo al descargar
$tamanoMaximo=1; // maximo de descarga en megabyte

header('Content-Type: application/octet-stream');
header('Content-Length: '.filesize($local_file));
header('Content-Disposition: filename='.$download_file);
 
readfile_chunked($download_file,true,$tamanoMaximo); 
    
function readfile_chunked($filename,$retbytes=true, $maxSize=1) { 
   $chunksize = $maxSize*(1024*1024); // how many bytes per chunk 
   $buffer = ''; 
   $cnt =0; 
   // $handle = fopen($filename, 'rb'); 
   $handle = fopen($filename, 'rb'); 
   if ($handle === false) { 
       return false; 
   } 
   while (!feof($handle)) { 
       $buffer = fread($handle, $chunksize); 
       echo $buffer; 
       ob_flush(); 
       flush(); 
       sleep(1);
       if ($retbytes) { 
           $cnt += strlen($buffer); 
       } 
   } 
       $status = fclose($handle); 
   if ($retbytes && $status) { 
       return $cnt; // return num. bytes delivered like readfile() does. 
   } 
   return $status; 

} 

]


El archivo a descargar es de 1296 MB
y descarga un archivo con un tamaño de 1,76 KB
Lo que debería haber hecho era descargar todo el archivo pero a una velocidad no superior a 1 mb.

No se que habría que modificar para que funcione

Alguna idea?

saludos
Tags: Download Files - PHP - PHP header - Question Votes: 0 - Answers: 2 - Views: 10 Share on: Google Facebook Twitter LinkedIn Link
 

Answers:

  • Date: 24-03-2015 06:47:56 Hola Walter, no se si te falto poner tu script en la pregunta, ya que mencionas "Convergí todo en este script" pero no hay ejemplo.

    Al margen de esto, basandome en lo que comentas y el script que hizo el usuario chrisputnam en el sitio oficial de php.net, te paso a responder:

    chrisputnam armo la función llamada readfile_chunked con el objeto de ir bajando al buffer de PHP los resultados de cada lectura realizada con fread(), ya que, segun comenta, readfile() le esta arrojando problemas de memoria con archivos grandes.

    <?php
    function readfile_chunked($filename,$retbytes=true) {
       $chunksize = 1*(1024*1024); // how many bytes per chunk
       $buffer = '';
       $cnt =0;
       // $handle = fopen($filename, 'rb');
       $handle = fopen($filename, 'rb');
       if ($handle === false) {
           return false;
       }
       while (!feof($handle)) {
           $buffer = fread($handle, $chunksize);
           echo $buffer;
           ob_flush();
           flush();
           if ($retbytes) {
               $cnt += strlen($buffer);
           }
       }
           $status = fclose($handle);
       if ($retbytes && $status) {
           return $cnt; // return num. bytes delivered like readfile() does.
       }
       return $status;
    
    }
    ?>


    Ojo, este comentario es de hace 9 años, tal vez en su momento había problemas, ahora hay una nota que dice: readfile() no presentará problemas de memoria, incluso al enviar ficheros grandes, por sí sola. Si se encuentra un error de memoria insuficiente asegúrese que el búfer de salida está desactivado con ob_get_level().


    Por otro lado, el usuario yura_imbp comenta una función para limitar la velocidad de descarga (también tiene su tiempo, unos 6 años):

    <?php
    $local_file = 'file.zip';
    $download_file = 'name.zip';
    
    // set the download rate limit (=> 20,5 kb/s)
    $download_rate = 20.5;
    if(file_exists($local_file) && is_file($local_file))
    {
        header('Cache-control: private');
        header('Content-Type: application/octet-stream');
        header('Content-Length: '.filesize($local_file));
        header('Content-Disposition: filename='.$download_file);
    
        flush();
        $file = fopen($local_file, "r");
        while(!feof($file))
        {
            // send the current file part to the browser
            print fread($file, round($download_rate * 1024));
            // flush the content to the browser
            flush();
            // sleep one second
            sleep(1);
        }
        fclose($file);}
    else {
        die('Error: The file '.$local_file.' does not exist!');
    }
    
    ?>


    El script es similar al de chrisputnam, pero en este caso utiliza un parametro de configuración $download_rate con el cual limita la velicidad de descarga, asociando dicho parametro al fread() y ejecutando un sleep(1) tras cada lectura.

    Espero que mi respuesta te sea de ayuda.

    Saludos y buen código,
    Fernando
      Votes: 1 - Link answer
     
  • Date: 24-03-2015 13:04:52 Hola fernando

    Si estaba el codigo, en el espacio en blanco de la pregunta
    Parece que no cerre bbcobde [code=php y por eso no se mostraba
    Ahi lo cerre con el ] y se esta viendo

    La idea es limitar por asi decirlo el ancho de banda

    Muchas gracias por tu respuesta.
    Lo voy a probar
    Saludos
      Votes: 0 - Link answer
     
To actively participate in the community first must authenticate, enter the system.Sign In
 
frjcbbae garagebible.com