asiadevmedia / guzzle-rate-limiter
A rate limiter for Guzzle
Requires
- php: ^7.1|^8.0
- guzzlehttp/guzzle: ^6.3|^7.0
Requires (Dev)
- larapack/dd: ^1.0
- phpunit/phpunit: ^9.3.3
README
A rate limiter middleware for Guzzle. Here's what you need to know:
- Specify a maximum amount of requests per minute or per second
- When the limit is reached, the process will
sleep
until the request can be made - Implement your own driver to persist the rate limiter's request store. This is necessary if the rate limiter needs to work across separate processes, the package ships with an
InMemoryStore
.
Installation
You can install the package via composer:
composer require asiadevmedia/guzzle-rate-limiter
Usage
Create a Guzzle middleware stack and register it on the client.
use GuzzleHttp\Client; use GuzzleHttp\HandlerStack; use Asiadevmedia\GuzzleRateLimiter\RateLimiterMiddleware; $stack = HandlerStack::create(); $stack->push(RateLimiterMiddleware::perSecond(3)); $client = new Client([ 'handler' => $stack, ]);
You can create a rate limiter to limit per second or per minute.
RateLimiterMiddleware::perSecond(3); // Max. 3 requests per second RateLimiterMiddleware::perMinute(5); // Max. 5 requests per minute
Custom stores
By default, the rate limiter works in memory. This means that if you have a second PHP process (or Guzzle client) consuming the same API, you'd still possibly hit the rate limit. To work around this issue, the rate limiter's state should be persisted to a cache. Implement the Store
interface with your own cache, and pass the store to the rate limiter.
use MyApp\RateLimiterStore; use Asiadevmedia\GuzzleRateLimiter\RateLimit; RateLimiterMiddleware::perSecond(3, new RateLimiterStore());
A Laravel example of a custom Store
:
<?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])); } }
Testing
composer test
Changelog
Please see CHANGELOG for more information on what has changed recently.
Contributing
Please see CONTRIBUTING for details.
Security
If you've found a bug regarding security please mail security@spatie.be instead of using the issue tracker.
Postcardware
You're free to use this package, but if it makes it to your production environment we highly appreciate you sending us a postcard from your hometown, mentioning which of our package(s) you are using.
Our address is: Spatie, Kruikstraat 22, 2018 Antwerp, Belgium.
We publish all received postcards on our company website.
Credits
License
The MIT License (MIT). Please see License File for more information.