Documentation

RateLimiter
in package

Table of Contents

Constants

GLOBAL_CLIENT_ID  : mixed = '__global_host__'
Pseudo client id used to key the host-wide, self-tracked request counter in the store (see {@see checkGlobalBeforeRequest()}). Never collides with a real client id, which is always a certificate SHA1 fingerprint.

Properties

$globalRateLimitPerSecond  : int
$lockDir  : string
$maxWaitSeconds  : int
$store  : RateLimitStoreInterface
$waitMode  : bool

Methods

__construct()  : mixed
Create a RateLimiter configured with a storage backend and a handling mode for exceeded limits.
acquireLock()  : resource
Acquire an exclusive, cross-process lock for the given client so that concurrent processes sharing the same client (e.g. the same certificate) serialize their check-send-update cycle instead of racing past each other's stale counters.
checkBeforeRequest()  : void
Ensures the client is allowed to make the next request by enforcing per-second and per-day rate limits.
checkGlobalBeforeRequest()  : void
Enforces a host-wide, self-tracked cap on requests per second across every certificate/client sharing this store.
handleRateLimits()  : void
Stores remaining rate-limit counts for a client for both the one-second and 24-hour windows.
isWaitMode()  : bool
Indicates whether the limiter is configured to wait when a rate limit is exceeded.
releaseLock()  : void
Release a lock previously acquired with {@see acquireLock()}.

Constants

GLOBAL_CLIENT_ID

Pseudo client id used to key the host-wide, self-tracked request counter in the store (see {@see checkGlobalBeforeRequest()}). Never collides with a real client id, which is always a certificate SHA1 fingerprint.

public mixed GLOBAL_CLIENT_ID = '__global_host__'

Properties

$globalRateLimitPerSecond

private int $globalRateLimitPerSecond

Methods

__construct()

Create a RateLimiter configured with a storage backend and a handling mode for exceeded limits.

public __construct(RateLimitStoreInterface $store[, bool $waitMode = true ][, string $lockDir = null ][, int $globalRateLimitPerSecond = 0 ][, int $maxWaitSeconds = 300 ]) : mixed
Parameters
$store : RateLimitStoreInterface

storage backend for per-client rate-limit state

$waitMode : bool = true

if true, the limiter will wait until the limit window resets; if false, it will throw a RateLimitExceededException when limits are exceeded

$lockDir : string = null

directory used to store per-client lock files that serialize concurrent requests (defaults to the system temp directory)

$globalRateLimitPerSecond : int = 0

host-wide cap on requests per second across ALL certificates/clients sharing this store, enforced by checkGlobalBeforeRequest(); 0 disables it (default, no behavior change)

$maxWaitSeconds : int = 300

in wait mode, the longest this limiter will ever sleep for; a required wait beyond this (e.g. most of a day-window reset) throws RateLimitExceededException instead of blocking the caller

acquireLock()

Acquire an exclusive, cross-process lock for the given client so that concurrent processes sharing the same client (e.g. the same certificate) serialize their check-send-update cycle instead of racing past each other's stale counters.

public acquireLock(string $clientId) : resource

The lock is released with releaseLock(); it is also released automatically by the OS if the process dies while holding it.

Parameters
$clientId : string

identifier of the client to lock (used to derive the lock file name)

Return values
resource

the open, locked file handle to pass to releaseLock()

checkBeforeRequest()

Ensures the client is allowed to make the next request by enforcing per-second and per-day rate limits.

public checkBeforeRequest(string $clientId) : void

If a window is exhausted and wait mode is enabled, pauses execution for the required seconds to clear the window; otherwise throws a RateLimitExceededException.

Parameters
$clientId : string

identifier of the client whose rate limits are checked

Tags
throws
RateLimitExceededException

if a rate limit is exceeded and wait mode is disabled

checkGlobalBeforeRequest()

Enforces a host-wide, self-tracked cap on requests per second across every certificate/client sharing this store.

public checkGlobalBeforeRequest() : void

Unlike checkBeforeRequest(), this does NOT rely on RB's response headers: those only ever report the remaining quota for the certificate that made the request, so a gateway-level limit shared by many certificates (e.g. per source IP or per account-holder) never shows up as an exhausted window on any single certificate — each one still has plenty of headroom while the shared limit is being blown through. This method instead counts requests this library itself has sent, in a fixed one-second bucket, and self-throttles against a configured cap.

The caller MUST serialize calls to this method across processes (see acquireLock() with GLOBAL_CLIENT_ID), since the read-increment-write cycle here is not atomic on its own.

A no-op when the cap is 0 (default): the true scope and size of RB's gateway-level limit is not documented, so this is opt-in until it has been confirmed and a sane value configured.

Tags
throws
RateLimitExceededException

if the cap is exceeded and wait mode is disabled

handleRateLimits()

Stores remaining rate-limit counts for a client for both the one-second and 24-hour windows.

public handleRateLimits(string $clientId, int $remainingSecond, int $remainingDay, int $timestamp) : void
Parameters
$clientId : string

Fingerprint identifying the client (e.g., certificate SHA1, serial+issuer).

$remainingSecond : int

remaining requests in the current one-second window

$remainingDay : int

remaining requests in the current 24-hour window

$timestamp : int

UNIX timestamp (seconds) when the limits were observed

isWaitMode()

Indicates whether the limiter is configured to wait when a rate limit is exceeded.

public isWaitMode() : bool
Return values
bool

true if the limiter waits until the rate-limit window expires, false otherwise

releaseLock()

Release a lock previously acquired with {@see acquireLock()}.

public releaseLock(resource $handle) : void
Parameters
$handle : resource

the file handle returned by acquireLock()

On this page

Search results