Basicamente lo que necesito es: Limitar la velocidad de descarga y la cantidad de descargas simultaneas por ip.
Lo estoy ejecutando en localhost, y me da resultados, pero hay un problema y es que cuando pongo "pausar" la descarga el script se sigue ejecutando, y con varias personas haciendo lo mismo, supongo una sobrecarga para el server..
La ideas es: empieza la descarga y se añade a la base de datos el nombre del archivo y la ip desde la que se lo esta descargando, cuando se termina de descargar o el usuario cancela la descarga, la fila se borra..
quizas hay alguna otra forma de hacer esto, o simplemente mejorar este script.. por eso queria que lo vieran.. gracias.
Código PHP:
<?
ignore_user_abort (true);
set_time_limit(0);
class Descarga
{
function Descarga ($file, $speed)
{
if ( !is_file ($file) )
{
header ( 'HTTP/1.0 404 Not Found' );
exit ();
}
else
{
$link = mysql_connect ('localhost', 'root', '');
mysql_select_db ('descargas', $link);
$sql = "SELECT * FROM descargandose WHERE ip='".$_SERVER['REMOTE_ADDR']."'";
$result = mysql_query($sql);
if ( mysql_num_rows($result) >= 1)
{
exit ('Solo 1 descarga a la vez.');
}
else
{
$sql = "INSERT INTO descargandose (name, ip) VALUES ('".$file."', '".$_SERVER['REMOTE_ADDR']."')";
mysql_query ($sql);
$fsize = filesize ($file);
$ctype = $this->file_type ( basename ( $file ) );
header ( 'Cache-Control: no-store, no-cache, must-revalidate' );
header ( 'Content-Type: ' . $ctype );
header ( 'Content-Disposition: attachment; filename=' . str_replace ( ' ', '-', $file ) );
header ( 'Content-Length: ' . $fsize );
$fp = fopen ($file, 'rb');
while ( !feof ($fp) )
{
if ( connection_aborted ())
{
$this->abort();
break;
}
print ( fread ($fp, (1024 * $speed)) );
flush();
sleep(1);
}
fclose ($fp);
$sql = "DELETE FROM descargandose WHERE ip='".$_SERVER['REMOTE_ADDR']."'";
mysql_query($sql);
exit ();
}
}
}
function file_type ( $file )
{
$ext = strtolower (substr (strrchr ($file, '.'), 1));
$mime = array
(
'doc' => 'application/msword',
'gif' => 'image/gif'
// sigue, pero lo corte para que no se haga muy extenso el post
);
return isset ($mime[$ext]) ? $mime[$ext] : 'application/octet-stream';
}
function abort ()
{
$link = mysql_connect ('localhost', 'root', '');
mysql_select_db ('descargas', $link);
$sql = "DELETE FROM descargandose WHERE ip='".$_SERVER['REMOTE_ADDR']."'";
mysql_query($sql);
exit ();
}
}
?>