How to limit speed of outgoing response from php script? So I have a script generating data in keep-alive connection. It just opens file and reads it. How to limit outgoing speed
(By now i have such code)
if(isset($_GET[FILE]))
{
$fileName = $_GET[FILE];
$file = $fileName;
if (!file_exists($file))
{
print('<b>ERROR:</b> php could not find (' . $fileName . ') please check your settings.');
exit();
}
if(file_exists($file))
{
# stay clean
@ob_end_clean();
@set_time_limit(0);
# keep binary data safe
set_magic_quotes_runtime(0);
$fh = fopen($file, 'rb') or die ('<b>ERROR:</b> php could not open (' . $fileName . ')');
# content headers
header("Content-Type: video/x-flv");
# output file
while(!feof($fh))
{
# output file without bandwidth limiting
print(fread($fh, filesize($file)));
}
}
}
So what shall I do to limit speed of response (limit to for example 50 kb/s)
Change your file output to be staggered rather that outputting the whole file in one go.
This will output 50kB then wait one second until the whole file is output. It should cap the bandwidth to around 50kB/second.
Even though this is possible within PHP, I'd use your web-server to control the throttling.
I wouldn't use php to limit the bandwidth:
For Apache: Bandwidth Mod v0.7 (How-To - Bandwidth Limiter For Apache2)
For Nginx: http://wiki.nginx.org/NginxHttpCoreModule#limit_rate
For Lighttpd: http://redmine.lighttpd.net/projects/lighttpd/wiki/Docs:TrafficShaping This even allows you to configure the speed per connection in PHP
I think the method of 'Ben S' and 'igorw' is wrong because they imply unlimited bandwidth which is a false assumption. Basically a script that says
will pause for a second after outputting $chunk_size number of bytes regardless of how long it took. If for example if your current throughput is 100kb and you want to stream at 250kb, the script above will take 2.5 seconds to do the print() and then wait yet another second, effectively pushing the real bandwidth down to around 70kb.
The solution should either measure the time it took for PHP to complete the print() statemnt or use a buffer and call flush with every fread(). The first approach would be:
while the second would be something like:
You can read n bytes and then use use sleep(1) to wait a second, as suggested here.
You could attach a
bandwidth-throttle/bandwidth-throttle
to a stream: