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!'); }
Author:
Jonas John
License:
Public Domain
Language:
PHP
Created:
08/05/2006
Updated:
03/23/2011
Tags:
network, http, files
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:
Thank you! Had everything i needed and more, all in one script. You sir are a hero.
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? :|
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)
- Dwayne Charrington.
http://www.dwaynecharrington.com
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.
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.