限制每个用户的带宽?

我们需要修改我们的带宽使用情况(每个用户在我们的网站上)。 我想要限制每个ip的带宽。 基本上我们希望连接到我们网站的用户只能下载@ 2.5Mbps或250KB /秒。 虽然能够caching和上传@无限速度..现在我们没有上限。

如果您担心公平,我不会build议限制每个用户。 只要连接计数较低,它就会工作,但最终所有有限连接的总和超过了您的可用带宽,情况就像没有限制一样糟糕。

有一个叫做随机公平队列的东西。 这将防止一个连接饿死和提高公平。 它使用散列algorithm识别连接,并按循环顺序一次为其提供一个数据包。

为了使SFQ起作用,首先要限制带宽,将队列移动到可以控制它的机器上。 这是我经常使用的一个非常简单的设置:

$TC qdisc del dev eth0 root handle 1 $TC qdisc add dev eth0 root handle 1: htb default 20 r2q 50 $TC class add dev eth0 parent 1: classid 1:1 htb rate 10mbit ceil 10mbit $TC qdisc add dev eth0 parent 1:1 handle 110: sfq perturb 10 $TC filter add dev eth0 parent 1: prio 3 protocol all u32 match u32 0 0 flowid 1:1 

如果你觉得这个有用,请解释你的动机,我可以提供更复杂的设置,以满足你的目的。

如果你正在谈论HTTPstream量,你可以引导用户到一个代理,如鱿鱼 。 Squid可以configuration为限制每个IP的带宽使用。 您可以在configuration参数中使用delay pools 。 你可以看看这个页面 。 你可以在互联网上find许多其他的网页。

我认为它也可以configuration为在启用身份validation时限制每个用户的带宽。

带宽用于下载和页面查看

我认为你更好的是在你的项目上创build额外的图层,然后在任何请求(如页面视图)之后添加一些大小,然后计算响应的大小并与用户的stream量

如果用户使用多于带宽则使带宽完成响应

这可以通过使用readfile()将数据拆分为块来实现。 您可以设置块大小,并设置一个睡眠()来控制块的发送速度。 我有代码没有很好的testing,但可以指出你在正确的方向,但阅读用户贡献的readfile文件和fpassthru在PHPnetworking将帮助。

以有限带宽发送可下载文件的一项基本技术是将fpassthrureadfile调用replace为以fread和sleep或呼入呼叫的方式读取文件的循环以限制速率。

但是这只需要照顾下载文件,它不会影响读取不经过PHP的静态文件,或者读取PHP页面的其他输出。 您还需要一个中心点,记住每个IP地址有多less个并发连接,并将分配的带宽分配给它们。

可能最好不要在PHP中这样做,而是在Apache或者内核级别,假设你不是共享主机。 对于Apache有bwmod扩展名。