OVH Community, your new community space.

Limitar Velocidad de Descarga Equitativamente


Raikkon
12/08/2008, 10:27
¡Muchas gracias!

JarFil
11/08/2008, 22:53
Raikkon, puedes limitar el ancho de banda con tc, disciplina cbq.

Chiva
11/08/2008, 21:43
Seguro que hay alguna aplicacion, para windows esta el Netlimiter, para linux no he mirado

Raikkon
11/08/2008, 20:12
Está bien el script, a mi por mi parte me gustaría saber si se puede limitar el ancho de banda del servidor entero, no solo del Apache.

Saludos.

eLkRi
11/08/2008, 17:16
JarFil, tenia mis dudas de si ya se hacia automaticamente por eso lo preguntaba, pero si eso es exactamente lo que quiero, y supongo que el problema de las conexiones limitando a una descarga por ip voy sobrao.

Gracias Marcos por el script por que aunque en principio no lo use desde luego es muy interesante ya que me opcion a un mayor control auqnue no era exactamente lo que buscaba, pero me peude servir para otras cosas.

Nuevamente gracias a todos por responder.

JarFil
11/08/2008, 16:47
Si entiendo bien la pregunta, no necesitas hacer nada. La velocidad de descarga, una vez que ha llegado al máximo de ancho de banda, se reparte por igual entre todas las conexiones (round-robin).

Remarco lo de conexiones para diferenciarlo de usuarios o IPs; si un usuario establece más de una conexión simultánea, tendrá tantos más "cachos" del ancho de banda.

MarcosBL
11/08/2008, 15:26
Hay soluciones del lado del servidor, tipo mods de Apache o Sphinx, os dejo esta del lado "script".

A ver si esto os sirve de algo (es muy viejo, php4 de las primeras versiones, probablemente haya ya formas mejores de hacerlo en PHP5, ni lo he mirado) , se limita la descarga desde PHP, pudiendo cambiar el ancho de banda por archivo las veces que se quieran, o incluso según el nº de Mb descargados en el dia, etc... la función limita a X Kb/s donde X es una variable con la que podeis jugar al gusto.

Con comentarios en el código y coloreada:

http://www.propiedadprivada.com/limi...-desde-php/77/

Resumida:

Código PHP:
function enviar_archivo($archivo$speed 100) {
// Veamos.. existe el fichero ?
    
if (!is_file($archivo)) {
        die(
"404 Archivo no encontrado");
    }
// Recolectamos información sobre el archivo
    
$archivo_nombre basename($archivo);
    
$archivo_extension strtolower(substr(strrchr($archivo_nombre,"."),1));
// Asignamos el Content-Type adecuado a cada tipo de archivo, esto se
// puede configurar al gusto, yo he incluído los más comunes para los
// ebooks: exe, zip, lit, pdf, mp3, html, html
    
switch($archivo_extension) {
        case 
"exe":
            
$ctype="application/octet-stream";
            break;
        case 
"zip":
            
$ctype="application/zip";
            break;
        case 
"lit":
            
$ctype="application/lit";
            break;
        case 
"pdf":
            
$ctype="application/pdf";
            break;
        case 
"mp3":
            
$ctype="audio/mpeg3";
            break;
        case 
"htm":
        case 
"html":
            
$ctype="text/html";
            break;
        case 
"txt":
            
$ctype="text/plain";
            break;
// Debemos tener cuidado con no dejar descargar por este
// método ficheros sensibles tales como ficheros .php, .inc, etc...
        
case "php":
        case 
"inc":
            die(
"No te dejo bajar ficheros "$archivo_extension .""
);
            break;
        default:
            
$ctype="application/force-download";
    }
// Empezamos con los headers
    
header("Cache-Control:");
    
header("Cache-Control: public");
    
header("Content-Type: $ctype");
// Meramente estético, sustituímos los posibles guiones bajos ( _ )
// por espacios en el nombre del fichero para bajar archivos más
// legibles. Ej: "fichero_a_bajar.pdf" se convierte en "fichero a bajar.pdf"
    
$archivo_nombre_limpio str_replace("_"" "$archivo_nombre);
// Forzamos la descarga en lugar de la apertura
    
$header='Content-Disposition: attachment; filename='.$archivo_nombre_limpio;
    
header($header);
    
header("Accept-Ranges: bytes");
    
$tamano filesize($archivo);
// Si el navegador nos solicita el http_range...
    
if(isset($_SERVER['HTTP_RANGE'])) {
// entonces le enviamos sólo el trozo que falta.
// (Mundialmente conocido como "resume")
    
list($a$rango)=explode("=",$_SERVER['HTTP_RANGE']);
    
str_replace($rango"-"$rango);
    
$tamano2=$tamano-1;
    
$nueva_longitud=$tamano2-$rango;
    
header("HTTP/1.1 206 Partial Content");
    
header("Content-Length: $nueva_longitud");
    
header("Content-Range: bytes $rango$tamano2/$tamano");
    } else {
// Si no le enviamos todo el pack
    
$tamano2=$tamano-1;
    
header("Content-Range: bytes 0-$tamano2/$tamano");
    
header("Content-Length: ".$tamano2);
    }
// Una vez tomadas estas decisiones, sólo queda abrir el archivo...
    
$puntero_al_fichero fopen("$archivo","rb");
// localizar el inicio de la parte que queremos enviar...
    
fseek($puntero_al_fichero,$posicion_inicio);
// y empezar a enviar. Aqui es donde se produce la magia... en base
// a la variable de velocidad, leemos ese número de Ks del archivo,
// lo enviamos... y nos "dormimos" un segundo. Esta forzada chapuza
// produce exactamente el efecto deseado... ralentizar la descarga a
// los X k/s que deseemos por cada envío.
    
while(!feof($puntero_al_fichero)) {
// Nos aseguramos de no producir un timeout por sobrepasar el
// tiempo máximo de ejecución de PHP en caso de archivos
// demasiado grandes.
        
set_time_limit(0);
// Ponemos los datos en el buffer...
        
print(fread($puntero_al_fichero,1024*$speed));
// Lanzamos el contenido del buffer...
        
flush();
// Y a dormir...
        
sleep(1);
    }
// Proceso completado, archivo descargado,
// todo el "pescao vendío"
    
fclose($puntero_al_fichero);
    exit;
}
// Y finalmente un ejemplo tonto de uso de la función
enviar_archivo("fichero.pdf",100);
?>

Chiva
11/08/2008, 14:18
Yo lo he dicho porque parecia que no habia quedado muy claro, pero no tengo ni idea de como hacerlo

eLkRi
11/08/2008, 11:54
chiva eso mismo es lo que quiero, pk en un principio claro, con limite fijo si hay 20 descargando son 40mbs y pues estaria desperdiciando los otros 60 restante.

Ademas las descargas se harian via web y no ftp ya que voy a montar una pequeña "megaupload"

Chiva
11/08/2008, 08:39
lo que deberia hacer es cambiar dinamicamente al ancho de banda por usuario segun el uso global, no poner un limite fijo, no?

NetLorK
11/08/2008, 07:15
Eso depende de tu servidor ftp, yo por ejemplo tengo instalado el vsftpd y configurado con la variable "local_max_rate=307200" dentro del fichero de configuracion, esto lo que hace es limitar el ancho de banda a 300k a cada usuario local. (si lo se, no uso usuarios virtuales porque a dia de hoy solo lo uso con 1 user XD )

Pero lo dicho, todo depende de que servidor ftp estes usando

eLkRi
10/08/2008, 12:27
Bien, tengo un servidor y ese servidor tiene un ancho de banda. La gente empieza a bajar y bajar ficheros del servidor cda uno de ellos al mazimo de su conexion hasta llegar al limite del ancho de banda, y para que unos no descarges a 3mb y otro a 1mb, como puedo hacer para que la velocidad se vaya igualando? o eso ya lo hace eso?