davidfricker/floodgates

基于漏桶算法的高速速率限制器

1.6.1 2018-05-31 19:50 UTC

This package is not auto-updated.

Last update: 2024-09-29 01:17:41 UTC


README

此速率限制类实现了“漏桶”算法。由于速率限制的标准文件存储不适合这项任务,因此Floodgates使用主内存中的Redis NoSQL存储。这意味着您必须安装Redis才能使用Floodgates。

安装

使用composer

composer require DavidFricker/Floodgates

使用示例

创建速率限制器

以下示例创建了一个在易失性内存中持久化的速率限制桶,其标识符为$UID,在任何60秒窗口内允许5个请求。

$UID = md5('127.0.0.1');
$bucket_capacity = 5;
$leak_rate = 60;
$Floodgates = new Floodgates($UID, $bucket_capacity, $leak_rate);

基本速率限制器使用

一旦您根据上一节中的说明创建了速率限制器对象,只需调用addDrop方法并检查其返回值。如果函数返回true,则UID未超过其允许的限制,因此您可以继续。

if (!$Floodgates->addDrop()) {
  die('Rate limit exceeded');
}

// perform the the task that would otherwise be rate limited here

高级速率限制器使用

某些应用程序可能需要单个HTTP调用增加速率限制器的计数超过一个,这在执行更昂贵的操作时通常是这种情况,例如使用PHP GD渲染图像。

要增加超过一个的滴计数,只需将您希望增加的整数传递给下面的addDrop调用。

$drops = 3;
if (!$Floodgates->addDrop($drops)) {
  die('Rate limit exceeded');
}

// perform the the task that would otherwise be rate limited here

建议

考虑启用交换文件以确保您的进程不会被系统杀死,如果您从不同的UID接收许多请求。

方法

addDrop

addDrop($drops = 1) 增加桶中的滴计数。在实际情况中,这意味着在当前时间窗口中减少可用的请求数量。

返回

boolean - 当UID有足够的剩余请求来满足此请求时返回true,当请求应该因超出速率限制而被拒绝时返回false

capacityLeft

capacityLeft() 获取在桶溢出之前可以添加到桶中的滴数。

返回

int - 表示在超出速率限制之前可以执行的操作的剩余请求的整数

capacityUsed

capacityUsed() 获取桶中当前的滴数。

返回

int - 表示在当前时间窗口中已执行请求数量的整数

isFull

isFull() 获取桶剩余容量的状态。

返回

boolean - 当对addDrop的后续请求将返回false时为true,即已达到请求限制

flush

flush() 重置桶内容,即从桶中清除所有滴。

返回

void

许可协议

在MIT许可下发布。