PHP code example of four-bytes / four-rate-limiting
1. Go to this page and download the library: Download four-bytes/four-rate-limiting library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
four-bytes / four-rate-limiting example snippets
use Four\RateLimit\RateLimiterFactory;
use Four\RateLimit\RateLimitConfiguration;
$config = new RateLimitConfiguration(
algorithm: RateLimitConfiguration::ALGORITHM_TOKEN_BUCKET,
ratePerSecond: 5.0,
burstCapacity: 10,
);
$factory = new RateLimiterFactory();
$limiter = $factory->create($config);
if ($limiter->isAllowed('my-api')) {
// execute request
}
// After the request: evaluate response headers
$limiter->updateFromHeaders('my-api', $response->getHeaders());
new RateLimitConfiguration(
algorithm: string, // Algorithm constant
ratePerSecond: float, // Average rate
burstCapacity: int, // Max concurrent requests
safetyBuffer: float, // 0.0–1.0, default: 0.8
endpointLimits: array, // Endpoint-specific overrides
headerMappings: array, // Response headers → internal fields
windowSizeMs: int, // Window size in ms
persistState: bool, // Persist state across requests
stateFile: ?string, // Path to state file
);
interface RateLimiterInterface {
public function isAllowed(string $key, int $tokens = 1): bool;
public function waitForAllowed(string $key, int $tokens = 1, int $maxWaitMs = 30000): bool;
public function getWaitTime(string $key): int;
public function reset(string $key): void;
public function resetAll(): void;
public function getStatus(string $key): array;
public function getTypedStatus(string $key): RateLimitStatus;
public function getAllStatuses(): array;
public function getAllTypedStatuses(): array;
public function cleanup(int $maxAgeSeconds = 3600): int;
public function updateFromHeaders(string $key, array $headers): void;
}
use Four\RateLimit\RateLimiterFactory;
/** @var \Psr\SimpleCache\CacheInterface $cache */
// Provide any PSR-16 compatible cache implementation
$factory = new RateLimiterFactory();
$limiter = $factory->create($config, $cache);
// The limiter now uses the cache backend for state persistence
$limiter->isAllowed('my-api');
use Four\RateLimit\Http\RateLimitMiddleware;
use Four\RateLimit\RateLimiterFactory;
use Four\RateLimit\RateLimitConfiguration;
use Four\RateLimit\Exception\RateLimitExceededException;
$config = new RateLimitConfiguration(
algorithm: RateLimitConfiguration::ALGORITHM_SLIDING_WINDOW,
ratePerSecond: 1.157,
burstCapacity: 150,
headerMappings: [
'limit' => 'X-RateLimit-Limit',
'remaining' => 'X-RateLimit-Remaining',
],
windowSizeMs: 86_400_000,
stateFile: '/tmp/my_api_rate_limit.json',
);
$factory = new RateLimiterFactory();
$limiter = $factory->create($config);
$middleware = new RateLimitMiddleware(
rateLimiter: $limiter,
key: 'my-api',
maxRetries: 3,
backoffMultiplier: 2.0,
maxWaitMs: 10000,
maxBackoffMs: 30000,
);
try {
$response = $middleware->execute(fn() => $httpClient->sendRequest($request));
} catch (RateLimitExceededException $e) {
// Rate limit exhausted after all retries
echo "Key: {$e->key}, Wait: {$e->waitTimeMs}ms";
}
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.