我有以下情况:
您可以从我们的服务器下载一些文件.如果您是“普通”用户,则您的带宽有限,例如500kbits.如果您是高级用户,您的带宽没有限制,可以尽快下载.但是我怎么能意识到这一点?
如何上传&合作?
您可以从我们的服务器下载一些文件.如果您是“普通”用户,则您的带宽有限,例如500kbits.如果您是高级用户,您的带宽没有限制,可以尽快下载.但是我怎么能意识到这一点?
如何上传&合作?
注意:您可以使用
PHP执行此操作,但我建议您让服务器本身处理调节.这个答案的第一部分涉及你的选择是什么,如果你想限制PHP的下载速度,但下面你会发现几个链接,你会发现如何管理下载限制使用服务器.
有一个PECL扩展,这使得这是一个非常简单的任务,称为pecl_http,其中包含函数http_throttle
.文档包含一个简单的例子,如何做到这一点.这个扩展还包含a HttpResponse
class,这是没有很好的文档的ATM,但我怀疑使用其setThrottleDelay玩和setBufferSize方法应该产生所需的结果(油门延迟=> 0.001,缓冲区大小20 ==〜20Kb /秒).从事物的外观,这应该是工作:
$download = new HttpResponse(); $download->setFile('yourFile.ext'); $download->setBufferSize(20); $download->setThrottleDelay(.001); //set headers using either the corresponding methods: $download->setContentType('application/octet-stream'); //or the setHeader method $download->setHeader('Content-Length',filesize('yourFile.ext')); $download->send();
如果你不能/不想安装它,你可以写一个简单的循环:
$file = array( 'fname' => 'yourFile.ext','size' => filesize('yourFile.ext') ); header('Content-Type: application/octet-stream'); header('Content-Description: file transfer'); header( sprintf( 'Content-Disposition: attachment; filename="%s"',$file['fname'] ) ); header('Content-Length: '. $file['size']); $open = fopen($file['fname'],"rb"); //handle error if (!$fh) while($chunk = fread($fh,2048))//read 2Kb { echo $chunk; usleep(100);//wait 1/10th of a second }
当然,不要缓冲输出,如果你这样做:),最好添加一个set_time_limit(0);声明也.如果文件很大,很可能您的脚本将在下载过程中遇害,因为它会触发最大执行时间.
另一种(也许最好的)方法是通过服务器配置来限制下载速度:
> using NGINX
> using Apache2
> using MS IIS(要么安装比特率调节模块,要么设置最大带宽)
我从来没有限制自己的下载速度,但是看着这些链接,我认为很简单,说Nginx是最简单的:
location ^~ /downloadable/ { limit_rate_after 0m; limit_rate 20k; }
这使得速率限制立即启动,并将其设置为20k.详情可在the nginx wiki找到.
就apache而言,这并不是那么难,但是它需要你启用鼠标模块
LoadModule ratelimit_module modules/mod_ratelimit.so
然后,告诉apache哪个文件应该被限制是一个简单的事情:
<IfModule mod_ratelimit.c> <Location /downloadable> SetOutputFilter RATE_LIMIT SetEnv rate-limit 20 </Location> </IfModule>