File download with speed limit

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

Remark:
I created this snippet around 2006, today there are much better solutions
available like the QoS Bandwidth Throttle PHP Class (Alternative link). (Thanks aargoth)

// 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!');
}
Snippet Details




Sorry folks, comments have been deactivated for now due to the large amount of spam.

Please try to post your questions or problems on a related programming board, a suitable mailing list, a programming chat-room,
or use a QA website like stackoverflow because I'm usually too busy to answer any mails related
to my code snippets. Therefore please just mail me if you found a serious bug... Thank you!


Older comments:

Tyler June 29, 2011 at 19:03
I spent hours looking for scripts, combining their abilities to rename, limit speed, and have quick linking but to no avail. In a fit of defeat i clicked my mouse one last time. And got this :)

Thank you! Had everything i needed and more, all in one script. You sir are a hero.
Ashok May 27, 2011 at 11:58
Very nice example its realy helpful me
Keri May 05, 2011 at 13:19
don't worked for me :|
when i access the page, the file is downloaded with maximum speed. I'm testing on localhost, the filesize is 7MB. Somebody expecting the same problem? :|
manish April 16, 2011 at 14:09
wahen we download video than what can do to increse speed .i m increase $download rate to 15000 but it can't help me
aargoth March 23, 2011 at 10:31
There is much better solution on:

phpclasses.org: http://www.phpclasses.org/package/6709-PHP-Limit-the-speed-of-files-served-for-download.html (registration required for download)

and

softpedia.com: http://webscripts.softpedia.com/script/PHP-Clases/QoS-Bandwidth-Throttler-66826.html (allows anonymous download of the class)
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.