<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
recranet / guzzle-rate-limiter-middleware example snippets
use GuzzleHttp\Client;
use GuzzleHttp\HandlerStack;
use Recranet\GuzzleRateLimiterMiddleware\RateLimiterMiddleware;
use Symfony\Component\Cache\Adapter\RedisAdapter;
use Symfony\Component\Lock\LockFactory;
use Symfony\Component\Lock\Store\RedisStore;
$redis = new \Redis();
$redis->connect('127.0.0.1', 6379);
$cache = new RedisAdapter($redis);
$lockFactory = new LockFactory(new RedisStore($redis));
$stack = HandlerStack::create();
$stack->push(RateLimiterMiddleware::perSecond(5, $cache, $lockFactory, 'api-client'));
$client = new Client([
'handler' => $stack,
]);
// 5 requests per second
RateLimiterMiddleware::perSecond(5, $cache, $lockFactory, 'api-client');
// 100 requests per minute
RateLimiterMiddleware::perMinute(100, $cache, $lockFactory, 'api-client');
// 10 requests per 30 seconds
RateLimiterMiddleware::perXSeconds(30, 10, $cache, $lockFactory, 'api-client');
// 1000 requests per 15 minutes
RateLimiterMiddleware::perXMinutes(15, 1000, $cache, $lockFactory, 'api-client');
// Sustained rate of 1 request per 5 seconds, with burst capacity of 3
RateLimiterMiddleware::tokenBucket(
rate: '5 seconds',
burst: 3,
cache: $cache,
lockFactory: $lockFactory,
id: 'api-client',
);
use Recranet\GuzzleRateLimiterMiddleware\Handler\SleepHandler;
$handler = new SleepHandler(
min: 0, // Minimum delay in ms
max: 300000, // Maximum delay in ms (5 minutes)
);
RateLimiterMiddleware::perSecond(5, $cache, $lockFactory, 'api-client', $handler);
use Psr\Http\Message\RequestInterface;
use Recranet\GuzzleRateLimiterMiddleware\Handler\RateLimitExceededHandler;
class LogAndSleepHandler implements RateLimitExceededHandler
{
public function __construct(
private LoggerInterface $logger,
) {
}
public function handle(int $waitMs, RequestInterface $request, array $options, callable $nextHandler): mixed
{
$this->logger->warning('Rate limit exceeded', [
'wait_ms' => $waitMs,
'uri' => (string) $request->getUri(),
]);
usleep($waitMs * 1000);
return null; // Return null to retry
}
}
use Symfony\Component\Cache\Adapter\RedisAdapter;
use Symfony\Component\Lock\Store\RedisStore;
$redis = new \Redis();
$redis->connect('127.0.0.1', 6379);
$cache = new RedisAdapter($redis);
$lockFactory = new LockFactory(new RedisStore($redis));
use Symfony\Component\Cache\Adapter\FilesystemAdapter;
use Symfony\Component\Lock\Store\FlockStore;
$cache = new FilesystemAdapter();
$lockFactory = new LockFactory(new FlockStore());
use Symfony\Component\Cache\Adapter\ApcuAdapter;
use Symfony\Component\Lock\Store\SemaphoreStore;
$cache = new ApcuAdapter();
$lockFactory = new LockFactory(new SemaphoreStore());
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.