Full stack developer Timo Prüße has created a that helps you set up advanced API request within your handler stack.

Here’s the description from the GitHub repository about what guzzle-advanced-throttle can do for external APIs that you are using that might have rate limits:

A Guzzle middleware that can throttle requests according to (multiple) defined rules. It is also possible to define a caching strategy, e.g. get the response from cache when the rate limit is exceeded or always get a cached value to spare your rate limits.

Guzzle Middlware

If you need to use the middleware directly outside of a project, you configure your rules as follows, which shows how flexible the middleware can be:

use hamburgscleanestGuzzleAdvancedThrottleRequestLimitRuleset;

$rules = new RequestLimitRuleset([
    [
        'host'             => 'https://www.google.com',
        'max_requests'     => 20,
        'request_interval' => 
    ],
    [
        'host'             => 'https://www.google.com',
        'max_requests'     => 00,
        'request_interval' => 20
    ]
]);

And here’s how you add the middleware to your handler stack within Guzzle:

$stack = new HandlerStack();
$stack->setHandler(new CurlHandler());
$stack->push((new ThrottleMiddleware($rules))->());

// Pass the stack to the client
$client = new Client([
    'base_uri' => 'https://www.google.com',
    'handler' => $stack
]);

Laravel Package

Timo has a Laravel Wrapper package for this Guzzle middleware, which makes it easy to configure the cache and rules for use within a Laravel application.

You can use the GuzzleThrottle facade in your Laravel projects to get a new Guzzle client instance with the Guzzle rate limit caching Handler stack:

$client = GuzzleThrottle::client([
    'base_uri' => 'https://www.google.com'
]);

And here’s what the example configuration looks like from the project’s README:

return [
    'cache' => [
        // Name of the configured driver in the Laravel cache config file / Also needs to be set when "no-cache" is set! Because it's used for the internal timers
        'driver'   => 'default',
        // Cache strategy: no-cache, cache, force-cache
        'strategy' => 'cache',
        // TTL in minutes
        'ttl'      => 900
    ],
    'rules' => [
        [
            // host (including scheme)
            'host'             => 'https://www.google.com',
            // maximum number of requests in the given interval
            'max_requests'     => 20,
            // interval in seconds till the limit is reset
            'request_interval' => 1
        ],
        [
            // host (including scheme)
            'host'             => 'https://www.google.com',
            // maximum number of requests in the given interval
            'max_requests'     => 100,
            // interval in seconds till the limit is reset
            'request_interval' => 120
        ]
    ]
];

Learn More

If you want to learn more about the guzzle-advanced-throttle middleware, check out hamburgscleanest/guzzle-advanced-throttle. For the accompanying Laravel package, check out hamburgscleanest/laravel-guzzle-throttle.

Timo Prüße is @TimoPruesse on Twitter, and Chroma91 on GitHub.





Source link
thanks you RSS link
( https://laravel-news.com/guzzle-advanced-throttling-middleware)

LEAVE A REPLY

Please enter your comment!
Please enter your name here