yiisoft/rate-limiter

Yii 速率限制中间件

3.0.0 2023-07-26 08:58 UTC

This package is auto-updated.

Last update: 2024-08-25 07:34:13 UTC


README

Yii

Yii 速率限制中间件


Latest Stable Version Total Downloads Build status Scrutinizer Code Quality Code Coverage Mutation testing badge static analysis type-coverage

速率限制中间件有助于通过限制可能连续发出的请求数量来防止滥用。

例如,您可能希望将每个用户的 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 软件 维护。

支持项目

Open Collective

关注更新

Official website Twitter Telegram Facebook Slack