File download with speed limit

This snippet shows you how to limit the download rate of a file download.

Snippet information

Author:
Jonas John

License:
Public Domain

Language:
PHP

Created:
08/05/2006

Updated:
08/05/2006

Tags:
, ,


// local file that should be send to the client
$local_file = 'test-file.zip';
// filename that the user gets as default
$download_file = 'your-download-name.zip';
 
// set the download rate limit (=> 20,5 kb/s)
$download_rate = 20.5; 
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!');
}


Found a bug? Or do you have a better solution for this?
Feel free to leave a message:

Add a comment


Leave a comment

nerveless.one September 14, 2009 at 20:46
The execution time limit doesn't count the time the script slept by calling sleep(). It counts *only* the actual time required by the commands and functions.
Paul van Swinderen September 12, 2009 at 15:02
Execution time doesn't appear to be a problem. My execution time is 30s, but could download a 160MB file with 1MB/s (Firefox said 3m remaining) without problems.
Paul van Swinderen September 12, 2009 at 14:47
Sweet! This really is a lifesaver when you have limited bandwidth!
yup June 16, 2008 at 19:10
As Djordje said: What about the php script execution time?!
Djordje February 15, 2008 at 15:52
What about script maximum execution time?
Dwayne Charrington February 12, 2008 at 05:28
Very nice example Jonas. I'll be sure to check out your other posts.

- Dwayne Charrington.
http://www.dwaynecharrington.com
Ahmed Farooq February 11, 2008 at 22:27
Close, but not very accurate - it doesn't factor in how long it takes to print and flush.

You need to count the time (before the print and after the flush). Afterwards subtract that amount from 1s, and THEN sleep for that new amount.
Dave February 11, 2008 at 22:17
mod_throttle and mod_bandwidth can both do this for you in Apache but this seems like a clever solution if you can't or don't want to add either of those modules.

The problem with rate limiting is that it increases the time that each client connection lasts for and hence it increases the number of concurrent connections. You may find that you hit your max_clients setting and start causing timeouts for your users.

You should probably also add "or is not a regular file." to the error message.