davidfricker / floodgates
基于漏桶算法的高速速率限制器
Requires
- php: ^5.3.3 || ^7.0
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许可下发布。