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); // trueGettery
$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 LimiterPreplá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 kryptomienOdoslaní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.