2017 © Pedro Peláez
 

library guzzle-throttle-middleware

A GuzzleHTTP Middleware that can delay requests before sending them.

image

bentools/guzzle-throttle-middleware

A GuzzleHTTP Middleware that can delay requests before sending them.

  • Friday, February 16, 2018
  • by bpolaszek
  • Repository
  • 1 Watchers
  • 3 Stars
  • 1,334 Installations
  • PHP
  • 0 Dependents
  • 0 Suggesters
  • 2 Forks
  • 1 Open issues
  • 6 Versions
  • 110 % Grown

The README.md

Latest Stable Version License Build Status Coverage Status Quality Score Total Downloads, (*1)

Guzzle Throttle Middleware

This middleware adds throttling capabilities to your Guzzle client., (*2)

This can be useful when some hosts limits your number of requests per second / per minute., (*3)

Installation

composer require bentools/guzzle-throttle-middleware, (*4)

Counter storage

By default, request counters are stored in an array., (*5)

But you can use the PSR6Adapter to store your counters within a psr/cache implementation, such as symfony/cache, and use shared storages like Redis, APCu, Memcached, ..., (*6)

Usage

For this middleware to work, you need to register some configurations., (*7)

A configuration is composed of: * A Request matcher (to trigger or not the throttler, depending on the request content) * A maximum number of requests * The period, in seconds, during which the maximum number of requests apply. * A storage key., (*8)

You can register as many configurations as you need. The 1st request matcher wins., (*9)

Example

namespace App\RequestMatcher;

use BenTools\Psr7\RequestMatcherInterface;
use Psr\Http\Message\RequestInterface;

class ExampleOrgRequestMatcher implements RequestMatcherInterface
{
    /**
     * @inheritDoc
     */
    public function matchRequest(RequestInterface $request)
    {
        return false !== strpos($request->getUri()->getHost(), 'example.org');
    }
}
use App\RequestMatcher\ExampleOrgRequestMatcher;
use BenTools\GuzzleHttp\Middleware\Storage\Adapter\ArrayAdapter;
use BenTools\GuzzleHttp\Middleware\ThrottleConfiguration;
use BenTools\GuzzleHttp\Middleware\ThrottleMiddleware;
use GuzzleHttp\Client;
use GuzzleHttp\HandlerStack;

require_once __DIR__ . '/vendor/autoload.php';

$stack = HandlerStack::create();
$middleware = new ThrottleMiddleware(new ArrayAdapter());

// Max 1 request per second
$maxRequests = 1;
$durationInSeconds = 1;
$middleware->registerConfiguration(
    new ThrottleConfiguration(new ExampleOrgRequestMatcher(), $maxRequests, $durationInSeconds, 'example')
);

$stack->push($middleware, 'throttle');
$client = new Client([
    'handler' => $stack,
]);

$client->get('http://www.example.org'); // Will be executed immediately
$client->get('http://www.example.org'); // Will be executed in 1 second

Tests

./vendor/bin/phpunit, (*10)

Known issues

Due to PHP's synchronous behaviour, remember that throttling means calling sleep() or usleep() functions, which will delay your entire script, and not only the current request., (*11)

This means throttling will also block Guzzle's asynchronous requests when using CurlMultiHandler., (*12)

To prevent this, you may have a look at bentools/guzzle-queue-handler, a handler that delegates asynchronous requests to PHP workers (Beanstalk, RabbitMQ, Redis, ...)., (*13)

You can then enable throttling only on workers., (*14)

See also

The Versions