beholdr / laravel-backoff-limiter
Laravel 的指数退避速率限制器。
v0.1.1
2024-03-25 07:39 UTC
Requires
- php: ^8.1
- illuminate/contracts: ^10.0 || ^11.0
- spatie/laravel-package-tools: ^1.14.0
Requires (Dev)
- larastan/larastan: ^2.0.1
- laravel/pint: ^1.0
- nunomaduro/collision: ^7.8
- orchestra/testbench: ^8.8
- pestphp/pest: ^2.20
- pestphp/pest-plugin-arch: ^2.0
- pestphp/pest-plugin-laravel: ^2.0
- phpstan/extension-installer: ^1.1
- phpstan/phpstan-deprecation-rules: ^1.0
- phpstan/phpstan-phpunit: ^1.0
README
Laravel 的指数退避速率限制器。
想象一下,您想通过发送短信验证客户的电话号码。但发送短信的费用很高,您不想允许过多的请求。Laravel 有 RateLimiter 类,但它非常简单。比如说,您每分钟接受 1 次尝试,但这允许一些不友好的人每分钟发送 1 条短信而没有任何惩罚。
使用 BackoffLimiter
类,您可以随着每次尝试而指数级增加退避时间。例如,第一次重试将在 1 分钟后可用,第二次在 4 分钟后,第三次在 9 分钟后等等。退避时间由以下公式确定
backoff_time = decay_time * attempts ^ exponent
支持
你喜欢 退避限制器 吗?请通过 Boosty 支持我。
安装
您可以通过 composer 安装此软件包
composer require beholdr/laravel-backoff-limiter
用法
您可以使用此软件包作为默认的 RateLimiter
类
use Beholdr\BackoffLimiter\BackoffLimiter; $executed = app(BackoffLimiter::class)->attempt( 'send-sms-'.request()->ip(), maxAttempts: 1, function () { // Send SMS } ) if (! $executed) { throw new Exception('Too many requests!'); }
或手动控制尝试次数
use Beholdr\BackoffLimiter\BackoffLimiter; $limiter = app(BackoffLimiter::class); $key = 'send-sms-'.request()->ip(); if ($limiter->tooManyAttempts($key, 1)) { throw new Exception('Too many requests!'); } $limiter->hit($key) // Send SMS
您可以设置
- 退避窗口:尝试计算的时间间隔。默认为
1 小时
- 指数:确定退避时间长度。默认为
2
要设置自定义值,请将您的值传递到类创建时
$limiter = app(BackoffLimiter::class, ['backoff' => 3*60*60, 'exponent' => 3]); $limiter->hit(...);
测试
composer test
许可证
MIT 许可证(MIT)。有关更多信息,请参阅 许可证文件。