Fasáda RateLimits
Fasáda RateLimits je jediný vstupný bod balíka na tvorbu limitov. Načíta singleton RateLimitManager z kontajnera, takže nakonfigurované úložisko a deferrer — alebo RateLimits::fake() — platia pre každý limit vrátane tých, ktoré vytvorí Http::rateLimit():
use Illuminate\Support\Facades\Http;
use RoundlyConsulting\HttpClientRateLimits\Facades\RateLimits;
// Build a limit and attach it to a request.
Http::rateLimit(RateLimits::perSecond(5)->by('acct-1'))->get('https://api.example.com/orders');
// Profiles and compound windows come from the same place.
$github = RateLimits::profile('github');
$api = RateLimits::compound([RateLimits::perSecond(5), RateLimits::perMinute(100)]);
// Inspect or clear a budget without sending anything.
$limit = RateLimits::perMinute(30)->by('acct-1');
$limit->remaining();
$limit->reset();Kompletné rozhranie
use RoundlyConsulting\HttpClientRateLimits\Facades\RateLimits;
RateLimits::make(Limit $limit); // from a Limit value object
RateLimits::perSecond(int $maxAttempts = 1); // N requests per second
RateLimits::perMinute(int $maxAttempts = 1); // N requests per minute
RateLimits::perHour(int $maxAttempts = 1); // N requests per hour
RateLimits::perDay(int $maxAttempts = 1); // N requests per day
RateLimits::profile(string $name); // a named profile from config
RateLimits::compound(array $limits); // several windows at once
RateLimits::usingStore(Store $store); // a copy of the manager on this store
RateLimits::usingDeferrer(Deferrer $deferrer); // … or with this deferrer
RateLimits::releasingJob(object $job); // … releasing a queued job instead of sleeping
RateLimits::retryAfter(Response|RequestException $response); // ?int seconds from Retry-After
RateLimits::store(); // the shared default store
RateLimits::deferrer(); // the default deferrer| Metóda | Vracia | Účel |
|---|---|---|
make(Limit $limit) | RateLimit | Vytvorí limit z hodnotového objektu Limit s úložiskom a deferrerom managera. |
perSecond / perMinute / perHour / perDay(int $maxAttempts = 1) | RateLimit | N požiadaviek za okno. |
profile(string $name) | RateLimit | Pomenovaný profil z konfigurácie limiters; neznáme meno vyhodí UnknownLimiterProfileException. |
compound(array $limits) | RateLimit | Viac okien naraz; prvé je primárne, platí najprísnejšie. |
usingStore(Store $store) | RateLimitManager | Kópia managera s týmto úložiskom; singleton zostane nedotknutý. |
usingDeferrer(Deferrer $deferrer) | RateLimitManager | Kópia managera s týmto deferrerom. |
releasingJob(object $job) | RateLimitManager | Kópia, ktorá namiesto čakania vráti úlohu do fronty (ReleaseDeferrer). |
retryAfter(Response|RequestException $response) | ?int | Počet sekúnd z hlavičky Retry-After (sekundy aj HTTP dátum); null, ak chýba alebo je nečitateľná. |
store() | Store | Zdieľané úložisko, do ktorého nové limity zapisujú pokusy. |
deferrer() | Deferrer | Deferrer, ktorým nové limity čakajú. |
fake() | RateLimitsFake | Nahradí manager zaznamenávajúcim testovacím fake. |
Čo limit dokáže
Každá továrenská metóda vráti RateLimit — Guzzle middleware, ktorý odovzdáte do Http::rateLimit() alebo Http::withMiddleware(), prípadne ním cez handle() obalíte ľubovoľné callable. Je fluentný a všetko, čo sám nedefinuje, presmeruje na podkladový Limit a potom na Limiter:
| Skupina | Metódy vráteného RateLimit |
|---|---|
| Nastavenie (fluentné) | by(), alongside(), maxWait(), jitter(), adaptive(), setStore(), setDeferrer() |
| Kontrola | remaining(), availableIn(), tooManyAttempts(), delayUntilNextRequestInMs(), getKey(), getMaxAttempts(), getTimespan(), isOverMaxAttempts(), isUnderMaxAttempts(), getStore(), getDeferrer(), getLimiter() |
| Vynulovanie | reset() |
| Spustenie | handle(callable) |
by() zmení kľúč všetkých okien, ktoré limit vynucuje; alongside() a compound() si odovzdané limity skopírujú, takže zmena kľúča výsledku ich nikdy neovplyvní.
Prepisy pre jedno miesto volania
Úložisko alebo deferrer prepíšete pre jedno miesto v kóde bez zásahu do globálnych predvolieb:
use RoundlyConsulting\HttpClientRateLimits\Deferrer\SleepDeferrer;
use RoundlyConsulting\HttpClientRateLimits\Facades\RateLimits;
use RoundlyConsulting\HttpClientRateLimits\Store\RedisStore;
// usingStore() / usingDeferrer() return a configured copy; the shared manager is untouched.
$limit = RateLimits::usingStore(new RedisStore('default'))
->usingDeferrer(new SleepDeferrer)
->perMinute(30);Uprednostňujete explicitnú závislosť pred statickým volaním? Pozrite si DI a akcie — injektovaný manager má rovnaké API.
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.