dxdo / rate-limit
Standalone component that facilitates rate-limiting functionality. Also provides a middleware designed for API and/or other application endpoints.
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: 2024-10-31 13:58:32 UTC
README
Component that facilitates rate-limiting functionality. Although designed as a standalone, it also provides a middleware designed for API and/or other application endpoints that be used with any framework that supports the middleware concept.
Based on nikolaposa/rate-limit
. Type-hinting and declare
function were removed to support PHP 5.6.
Installation
The preferred method of installation is via Composer. Run the following
command to install the latest version of a package and add it to your project's composer.json
:
composer require wellingguzman/rate-limit
Usage
Standalone
$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
Note: in-memory rate limiter should only be used for testing purposes. This package also provides Redis-backed rate limiter:
$rateLimiter = \RateLimit\RateLimiterFactory::createRedisBackedRateLimiter([ 'host' => '10.0.0.7', 'port' => 6379, ], 1000, 3600);
Middleware
Zend Expressive example:
$app = \Zend\Expressive\AppFactory::create(); $app->pipe(\RateLimit\Middleware\RateLimitMiddleware::createDefault( \RateLimit\RateLimiterFactory::createRedisBackedRateLimiter([ 'host' => '10.0.0.7', 'port' => 6379, ], 1000, 3600) ));
Slim example:
$app = new \Slim\App(); $app->add(\RateLimit\Middleware\RateLimitMiddleware::createDefault( \RateLimit\RateLimiterFactory::createRedisBackedRateLimiter([ 'host' => '10.0.0.7', 'port' => 6379, ], 1000, 3600) ));
Whitelisting requests:
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; }, ] );
Custom limit exceeded handler:
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); }, ] );
Author
Nikola Poša
Copyright and license
Copyright 2017 Nikola Poša. Released under MIT License - see the LICENSE
file for details.