asiadevmedia / guzzle-rate-limiter
为 Guzzle 设计的速率限制器
v1.0.0
2024-09-12 15:52 UTC
Requires
- php: ^7.1|^8.0
- guzzlehttp/guzzle: ^6.3|^7.0
Requires (Dev)
- larapack/dd: ^1.0
- phpunit/phpunit: ^9.3.3
README
这是一个为 Guzzle 设计的速率限制器中间件。以下是您需要了解的信息
- 指定每分钟或每秒的最大请求数量
- 当达到限制时,进程将
sleep
直到可以发出请求 - 实现自己的驱动程序以持久化速率限制器的请求存储。如果速率限制器需要在不同的进程中工作,该软件包附带一个
InMemoryStore
。
安装
您可以通过 composer 安装此软件包
composer require asiadevmedia/guzzle-rate-limiter
使用
创建一个Guzzle 中间件堆栈并将其注册到客户端。
use GuzzleHttp\Client; use GuzzleHttp\HandlerStack; use Asiadevmedia\GuzzleRateLimiter\RateLimiterMiddleware; $stack = HandlerStack::create(); $stack->push(RateLimiterMiddleware::perSecond(3)); $client = new Client([ 'handler' => $stack, ]);
您可以创建一个速率限制器以限制每秒或每分钟的请求数量。
RateLimiterMiddleware::perSecond(3); // Max. 3 requests per second RateLimiterMiddleware::perMinute(5); // Max. 5 requests per minute
自定义存储
默认情况下,速率限制器在内存中工作。这意味着如果您有一个第二个 PHP 进程(或 Guzzle 客户端)正在消耗相同的 API,您仍然可能会达到速率限制。为了解决这个问题,速率限制器的状态应持久化到缓存中。使用您自己的缓存实现 Store
接口,并将存储传递给速率限制器。
use MyApp\RateLimiterStore; use Asiadevmedia\GuzzleRateLimiter\RateLimit; RateLimiterMiddleware::perSecond(3, new RateLimiterStore());
自定义 Store
的 Laravel 示例
<?php namespace MyApp; use Asiadevmedia\GuzzleRateLimiter\Store; use Illuminate\Support\Facades\Cache; class RateLimiterStore implements Store { public function get(): array { return Cache::get('rate-limiter', []); } public function push(int $timestamp, int $limit) { Cache::put('rate-limiter', array_merge($this->get(), [$timestamp])); } }
测试
composer test
更新日志
有关最近更改的更多信息,请参阅更新日志。
贡献
有关详细信息,请参阅贡献。
安全性
如果您发现有关安全性的错误,请通过 security@spatie.be 发送电子邮件,而不是使用问题跟踪器。
明信片软件
您可以使用此软件包,但如果它进入您的生产环境,我们非常希望您从您的家乡寄给我们一张明信片,并提到您正在使用我们的哪个软件包。
我们的地址是:Spatie,Kruikstraat 22,2018 安特卫普,比利时。
我们将发布所有收到的明信片在我们的公司网站上。
致谢
许可证
MIT 许可证 (MIT)。有关更多信息,请参阅许可证文件。