海运的博客

流量控制限制单位时间内连接数算法

发布时间:January 11, 2015 // 分类:算法 // No Comments

有时要在服务器端控制每个IP单位时间内连接数,或在客户端限制对某个服务器单位时间内的请求数,可以使用以下算法:
1.Leaky Bucket漏桶算法
2.Token Bucket令牌桶算法
3.使用hash ttl计数
PHP实现的一个Token Bucket令牌桶算法,原理是计算上次请求时间到现在请求时间增加的令牌数,然后看令牌桶内是否有空余的令牌,每次请求后令牌减1,由于php变量生存期为脚本执行期,在应用中可将数据保存到共享内存为数据库:

<?php
   class TokenBucket {
      private $capacity;
      private $tokens;
      private $rate;
      private $timestamp;
      //rate为每秒限制连接数,同时初始桶大小为rate
      public function __construct($rate) {
         $this->capacity = $rate;
         $this->tokens = $rate;
         $this->rate = $rate;
         $this->timestamp = time();
      }
      public function consume() {
         //如果令牌少于1返回false
         if (($tokens = $this->tokens()) < 1) {
            return false;
         }
         //本次请求后令牌减1
         $this->tokens--;
         return true;
      }
      public function tokens() {
         $now = time();
         if ($this->tokens < $this->capacity) {
            //计算上次请求时间到现在要增加的令牌数
            $delta = $this->rate * ($now - $this->timestamp);
            $this->tokens = min($this->capacity, $this->tokens + $delta);
         }
         //更新请求时间
         $this->timestamp = $now;
         return $this->tokens;
      }
   }
   $tk = new TokenBucket(5, 5);
   for ($i = 1; $i < 6; $i++) {
      var_dump($tk->consume());
   }
   sleep(1);
   for ($i = 1; $i < 6; $i++) {
      var_dump($tk->consume());
   }

?>

输出如下:

bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(false)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(false)
分类
最新文章
最近回复
  • 海运: 你是编译不成功呢?还是编译后不能运行呢?还是运行后不能访问web界面呢?
  • 白墨: 可能不清楚就是编译安装后启动后访问不了web界面
  • 白墨: 你好博主按照你的教程是编译安装不了的,在centos7版本下,我在开源镜像站下载centos7...
  • 感谢: 好的谢谢。
  • 海运: 可在github选择指定的branch或tag查看Makefile文件内核版本git指定bra...
  • 感谢: 请问一下“git checkout 20181012”这条命令是什么意思,没有google到。...
  • 海运: 抱歉,我没用蓝牙,现在N1在稳定挂PT中,没法折腾了。
  • hxhw: 大神能弄一個N1盒子開啟藍芽的教程不?我目前的藍芽識別不了似的(BD Address: 00:...
  • 海运: 抱歉,没用过wireguard,不了解具体情况。看错误提示是创建虚拟网卡的类型wireguar...
  • zhu tie: 本人小白我想在n1上装wireguard,安装后错误信息如下:wg-quick up wg0[...
页面执行耗时:0.0744秒。-->