NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky
HTTP Client Rate Limits for Laravel

Kontrola pred odoslaním

Pred odoslaním sa limitera opýtajte na aktuálny stav — bez zaznamenania pokusu:

use RoundlyConsulting\HttpClientRateLimits\Facades\RateLimits;

$limit = RateLimits::perMinute(30)->by('acct-1');

$limit->remaining();        // requests still allowed in the window (0 during a server penalty)
$limit->availableIn();      // ms until the next request is allowed (0 = now)
$limit->tooManyAttempts();  // bool: is the window exhausted right now?

Oneskorenie v danom čase

RateLimit presmeruje volania na podkladový Limit a Limiter, takže zistíte, ako dlho by ste čakali v konkrétnom okamihu (v milisekundách, podľa hodín deferrera):

$middleware = RateLimits::perHour(6);

$at    = $middleware->getDeferrer()->timestamp();
$delay = $middleware->delayUntilNextRequestInMs($at); // 0 = send now, else wait this many ms

$middleware->isOverMaxAttempts(7); // true

Gettery

$limit = RateLimits::perMinute(30)->by('acct-1');

$limit->getKey();               // 'acct-1'
$limit->getMaxAttempts();       // 30
$limit->getTimespan();          // 'minute'
$limit->isUnderMaxAttempts(29); // true
$limit->getStore();             // the Store in use
$limit->getDeferrer();          // the Deferrer in use
$limit->getLimiter();           // the underlying Limiter

Preplánovanie namiesto čakania

Kontrola číta úložisko, preto ju v úlohách vo fronte kombinujte so zdieľaným úložiskom. Úloha sa potom môže sama vrátiť do fronty namiesto čakania:

public function handle(): void
{
    // Needs a shared store (cache, Redis or database) so every run reads the same budget.
    $limit = RateLimits::profile('github')->by("acct:{$this->accountId}");

    if ($limit->tooManyAttempts()) {
        $this->release((int) ceil($limit->availableIn() / 1000));

        return;
    }

    Http::withMiddleware($limit)->get('https://api.github.com/user');
}

Kontrolné metódy opisujú primárne okno (vrátane prípadnej adaptívnej penalizácie) a nič nezaznamenajú; zložené okná sa vyhodnocujú pri odoslaní požiadavky.

Vynulovanie limitu

Vymažte pokusy zaznamenané pre kľúč — po zmene tarify alebo medzi dvoma fázami dávky —, aby ďalšia požiadavka prešla okamžite:

use RoundlyConsulting\HttpClientRateLimits\Facades\RateLimits;

RateLimits::perMinute(60)->by('stripe')->reset();

// A compound limit clears every window it enforces.
RateLimits::perSecond(5)->by('stripe')->alongside(RateLimits::perMinute(100)->by('stripe'))->reset();

Vynulovanie vymaže okná, ktoré limit vynucuje (v prvom riadku stripe:minute), nie iné okná s rovnakým kľúčom, a nezruší penalizáciu, ktorú adaptívny limit zapísal podľa hlavičky Retry-After servera — o toto čakanie požiadal server. Spustí udalosť RateLimitReset.

Prejavte lásku k open source

Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.

Ďalšie spôsoby podpory vrátane kryptomien

Odoslaním daru súhlasíte s našimi podmienkami prijímania darov.

Chcete to zabudovať do svojho produktu?

Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.