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.');
}
?>
I tried my hand at a custom class that can help you deal with rate limiting downloads, you could try the following?
I've hosted the file as a gist aswell on github here. - https://gist.github.com/3687527
Downloader class is good but have one problem if you have two downloads at same time, you will lose
max_execution_time
value.Some example:
Download first file(size = 1mb; download time 100 seconds )
After one second download second file ( size = 100 mb; dowload time = 10000 seconds)
First download set
max_execution_time
to 0Second remeber
_oldMaxExecTime
as 0First download end and return
max_execution_time
to old valueSecond download end and return
max_execution time
to 0try this: http://labs.easyblog.it/download-limiter-php/
using pv unix command for best for greater precision in the bandwidth
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.First of all
max_execution_time
is the execution time of your script. Sleeping is not part of it.Regarding speed limiting you could use something like a Token bucket. I've put everything into one convenient library for you:
bandwidth-throttle/bandwidth-throttle
A second is too much time, it will make clients think that the server is unresponsive and prematurely end the download. Change
sleep(1)
tousleep(200)
: