Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Limit download speed using PHP

I found on Google some PHP scripts to limit the download speed of a file, but the file download at 10 Mbps or if it download at 80 kbps as i set it, after 5 mb, it stops downloading.

Can some one tell me where I can found a good PHP download speed limit script please?

Thank you very much

--- Edit ---

Here is the code :

<?php
set_time_limit(0);
// change this value below
$cs_conn = mysql_connect('localhost', 'root', '');
mysql_select_db('shareit', $cs_conn);

// local file that should be send to the client
$local_file = $_GET['file'];
// filename that the user gets as default
$download_file = $_GET['file'];

// set the download rate limit (=> 20,5 kb/s)
$download_rate = 85; 
if(file_exists($local_file) && is_file($local_file)) {
    // send headers
    header('Cache-control: private');
    header('Content-Type: application/octet-stream'); 
    header('Content-Length: '.filesize($local_file));
    header('Content-Disposition: filename='.$download_file);

    // flush content
    flush();    
    // open file stream
    $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);    
    }    

    // close file stream
    fclose($file);}
else {
    die('Error: The file '.$local_file.' does not exist!');
}




if ($dl) {
} else {
    header('HTTP/1.0 503 Service Unavailable');
    die('Abort, you reached your download limit for this file.');
}
?>
like image 861
Jeremy Dicaire Avatar asked Oct 23 '10 02:10

Jeremy Dicaire


2 Answers

The reason your download stops after 5MB is because it takes over 60 seconds to download 5MB at 80KB/s. Most of those "speed limiter" scripts use sleep() to pause for a while after sending a chunk, resume, send another chunk, and pause again. But PHP will automatically terminate a script if it's been running for a minute or more. When that happens, your download stops.

You can use set_time_limit() to prevent your script from being terminated, but some web hosts will not allow you to do this. In that case you're out of luck.

like image 183
kijin Avatar answered Oct 13 '22 19:10

kijin


A second is too much time, it will make clients think that the server is unresponsive and prematurely end the download. Change sleep(1) to usleep(200):

set_time_limit(0);

$file = array();
$file['name'] = 'file.mp4';
$file['size'] = filesize($file['name']);

header('Content-Type: application/octet-stream');
header('Content-Description: file transfer');
header('Content-Disposition: attachment; filename="' . $file['name'] . '"');
header('Content-Length: '. $file['size']);

$open = fopen($file['name'], 'rb');
while( !feof($open) ){
    echo fread($open, 256);
    usleep(200);
}
fclose($open);
like image 38
softwarefreak Avatar answered Oct 13 '22 20:10

softwarefreak