directus / rate-limit
独立的组件,便于实现速率限制功能。同时提供专为 API 和/或其他应用程序端点设计的中间件。
dev-master / 1.0.x-dev
2019-02-22 21:28 UTC
Requires
- php: ^5.6 | ^7.0
- psr/http-message: ^1.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.0
- phpunit/phpunit: ^4.7 | ^5.0
- zendframework/zend-diactoros: ^1.3
This package is not auto-updated.
Last update: 2020-11-15 11:36:54 UTC
README
便于实现速率限制功能的组件。虽然作为独立组件设计,但也提供了适用于任何支持中间件概念的框架的 API 和/或其他应用程序端点中间件。
基于 nikolaposa/rate-limit
。移除了类型提示和 declare
函数以支持 PHP 5.6。
安装
首选的安装方法是使用 Composer。运行以下命令以安装包的最新版本并将其添加到项目的 composer.json
composer require wellingguzman/rate-limit
使用方法
独立使用
$rateLimiter = \RateLimit\RateLimiterFactory::createInMemoryRateLimiter(1000, 3600); echo $rateLimiter->getLimit(); //1000 echo $rateLimiter->getWindow(); //3600 $rateLimiter->hit('key'); echo $rateLimiter->getRemainingAttempts('key'); //999 echo $rateLimiter->getResetAt('key'); //1486503558
注意:内存速率限制器仅适用于测试目的。此包还提供了基于 Redis 的速率限制器。
$rateLimiter = \RateLimit\RateLimiterFactory::createRedisBackedRateLimiter([ 'host' => '10.0.0.7', 'port' => 6379, ], 1000, 3600);
中间件
Zend Expressive 示例
$app = \Zend\Expressive\AppFactory::create(); $app->pipe(\RateLimit\Middleware\RateLimitMiddleware::createDefault( \RateLimit\RateLimiterFactory::createRedisBackedRateLimiter([ 'host' => '10.0.0.7', 'port' => 6379, ], 1000, 3600) ));
Slim 示例
$app = new \Slim\App(); $app->add(\RateLimit\Middleware\RateLimitMiddleware::createDefault( \RateLimit\RateLimiterFactory::createRedisBackedRateLimiter([ 'host' => '10.0.0.7', 'port' => 6379, ], 1000, 3600) ));
白名单请求
use Psr\Http\Message\RequestInterface; $rateLimitMiddleware = \RateLimit\Middleware\RateLimitMiddleware::createDefault( \RateLimit\RateLimiterFactory::createRedisBackedRateLimiter([ 'host' => '10.0.0.7', 'port' => 6379, ], 1000, 3600), [ 'whitelist' => function (RequestInterface $request) { if (false !== strpos($request->getUri()->getPath(), 'admin')) { return true; } return false; }, ] );
自定义超出限制的处理程序
use Psr\Http\Message\RequestInterface; use Zend\Diactoros\Response\JsonResponse; $rateLimitMiddleware = \RateLimit\Middleware\RateLimitMiddleware::createDefault( \RateLimit\RateLimiterFactory::createRedisBackedRateLimiter([ 'host' => '10.0.0.7', 'port' => 6379, ], 1000, 3600), [ 'limitExceededHandler' => function (RequestInterface $request) { return new JsonResponse([ 'message' => 'API rate limit exceeded', ], 429); }, ] );
作者
Nikola Poša
版权和许可证
版权 2017 Nikola Poša。在 MIT 许可证下发布 - 有关详细信息,请参阅 LICENSE
文件。