yiisoft / rate-limiter
Yii 速率限制中间件
3.0.0
2023-07-26 08:58 UTC
Requires
- php: ^8.0
- psr/http-factory: ^1.0
- psr/http-message: ^1.1|^2.0
- psr/http-message-implementation: 1.0
- psr/http-server-handler: ^1.0
- psr/http-server-middleware: ^1.0
- psr/simple-cache: ^2.0|^3.0
- yiisoft/http: ^1.2
Requires (Dev)
- ext-apcu: *
- maglnet/composer-require-checker: ^4.4
- nyholm/psr7: ^1.0
- phpunit/phpunit: ^9.5
- rector/rector: ^0.17.7
- roave/infection-static-analysis-plugin: ^1.16
- spatie/phpunit-watcher: ^1.23
- vimeo/psalm: ^4.30|^5.13
- yiisoft/cache: ^3.0
Suggests
- ext-apcu: To use APCu storage
This package is auto-updated.
Last update: 2024-08-25 07:34:13 UTC
README
Yii 速率限制中间件
速率限制中间件有助于通过限制可能连续发出的请求数量来防止滥用。
例如,您可能希望将每个用户的 API 使用限制在 10 分钟内的最多 100 个 API 调用。如果在指定的时间内收到来自用户的过多请求,应返回状态码 429(表示“请求过多”)的响应。
要求
- PHP 8.0 或更高版本。
安装
可以使用 Composer 安装此包。
composer require yiisoft/rate-limiter
通用用法
use Psr\Http\Message\ServerRequestInterface; use Yiisoft\Yii\RateLimiter\LimitRequestsMiddleware; use Yiisoft\Yii\RateLimiter\Counter; use Nyholm\Psr7\Factory\Psr17Factory; use Yiisoft\Yii\RateLimiter\Policy\LimitAlways; use Yiisoft\Yii\RateLimiter\Policy\LimitPerIp; use Yiisoft\Yii\RateLimiter\Policy\LimitCallback; use Yiisoft\Yii\RateLimiter\Storage\StorageInterface; use Yiisoft\Yii\RateLimiter\Storage\SimpleCacheStorage; /** @var StorageInterface $storage */ $storage = new SimpleCacheStorage($cache); $counter = new Counter($storage, 2, 5); $responseFactory = new Psr17Factory(); $middleware = new LimitRequestsMiddleware($counter, $responseFactory); // LimitPerIp by default
在上面的示例中,2 是在限制增量(请求)之前可以执行的最大增量次数,5 是应用限制的周期,单位为秒。
Counter
实现了 通用单元格速率限制算法 (GCRA),确保在达到限制后,进一步的增加将平均分配。
注意:虽然它足够有效,但建议使用 Nginx 或其他支持速率限制的 Web 服务器功能。此包允许在无法控制部署环境(如可安装的 CMS)的项目中实现速率限制。
实现自己的限制策略
该包中提供了两种可用的现成限制策略
LimitAlways
- 计算所有传入请求。LimitPerIp
- 分别计算来自不同 IP 的请求。
这些策略可以按以下方式应用
$middleware = new LimitRequestsMiddleware($counter, $responseFactory, new LimitPerIp()); // or $middleware = new LimitRequestsMiddleware($counter, $responseFactory, new LimitAlways());
自定义策略的最简单方法是使用 LimitCallback
$middleware = new LimitRequestsMiddleware($counter, $responseFactory, new LimitCallback(function (ServerRequestInterface $request): string { // return user id from database if authentication id used i.e. limit guests and each authenticated user separately. }));
另一种方法是实现 Yiisoft\Yii\RateLimiter\Policy\LimitPolicyInterface
并以类似的方式使用。
实现自己的计数器存储
该包中提供了两种可用的现成计数器存储
\Yiisoft\Yii\RateLimiter\Storage\SimpleCacheStorage
- 在任何 PSR-16 缓存中存储计数器。\Yiisoft\Yii\RateLimiter\Storage\ApcuStorage
- 使用 APCu PHP 扩展 存储计数器,同时考虑并发性。
要使用自己的存储,实现 Yiisoft\Yii\RateLimiter\Storage\StorageInterface
。
文档
如果您需要帮助或有疑问,请访问 Yii 论坛。您还可以查看其他 Yii 社区资源。
许可
Yii 速率限制中间件是免费软件。它根据 BSD 许可证条款发布。有关更多信息,请参阅 LICENSE
。
由 Yii 软件 维护。