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

Obmedzenie požiadaviek

Každý HTTP poskytovateľ — google, ipinfo, ip2location a maxmind_web — posiela požiadavky cez http-client-rate-limits-for-laravel, takže volania sa spomalia skôr, než narazia na API tretej strany, namiesto zbytočných odpovedí 429. Každý poskytovateľ má vlastný limit s kľúčom geolocation:{provider}:{owner}. Offline poskytovatelia maxmind_database a default nerobia sieťové volania a nikdy sa nespomaľujú.

Predvolené limity

Poskytovateľlimit / perEnv
google50 / secondGEOLOCATION_GOOGLE_RATELIMIT, …_PER
ipinfo60 / minuteGEOLOCATION_IPINFO_RATELIMIT, …_PER
ip2location60 / minuteGEOLOCATION_IP2LOCATION_RATELIMIT, …_PER
maxmind_web60 / minuteGEOLOCATION_MAXMIND_WEB_RATELIMIT, …_PER

Všetky limity sú adaptívne a predvolene čakajú.

Kľúče pre každého poskytovateľa

Každý HTTP poskytovateľ má blok rate_limits v services.<provider>:

'ipinfo' => [
    // ...
    'rate_limits' => [
        'enabled' => env('GEOLOCATION_IPINFO_RATELIMIT_ENABLED', true),
        'owner' => env('GEOLOCATION_RATELIMIT_OWNER', 'app'),
        'limit' => env('GEOLOCATION_IPINFO_RATELIMIT', 60),
        'per' => env('GEOLOCATION_IPINFO_RATELIMIT_PER', 'minute'), // second|minute|hour|day
        'adaptive' => env('GEOLOCATION_IPINFO_RATELIMIT_ADAPTIVE', true),
        'max_wait' => env('GEOLOCATION_IPINFO_RATELIMIT_MAX_WAIT'), // ms; null = pace, set = fail fast
        'jitter' => env('GEOLOCATION_IPINFO_RATELIMIT_JITTER'), // ms; null = none
    ],
],
KľúčPredvolenéEnv (pre google)Účel
enabledtrueGEOLOCATION_GOOGLE_RATELIMIT_ENABLEDfalse posiela bežným klientom bez obmedzenia.
ownerappGEOLOCATION_RATELIMIT_OWNERSegment vlastníka v kľúči limitu (spoločný pre všetkých poskytovateľov). Prázdna hodnota sa považuje za nenastavenú (platí predvolená); hodnota, ktorá nie je reťazcom, vyhodí výnimku.
limit50 (google) / 60GEOLOCATION_GOOGLE_RATELIMITMax počet požiadaviek za okno, najmenej 1.
persecond (google) / minuteGEOLOCATION_GOOGLE_RATELIMIT_PEROkno: second, minute, hour alebo day; prázdna hodnota sa považuje za nenastavenú (platí predvolená); iná hodnota vyhodí InvalidConfigurationException.
adaptivetrueGEOLOCATION_GOOGLE_RATELIMIT_ADAPTIVERešpektovať Retry-After z odpovede 429.
max_waitnullGEOLOCATION_GOOGLE_RATELIMIT_MAX_WAITStrop na rýchle zlyhanie v ms (0 alebo viac); null alebo prázdna hodnota = čakať.
jitternullGEOLOCATION_GOOGLE_RATELIMIT_JITTERNáhodný rozptyl v ms pridaný k odkladu (0 alebo viac); null alebo prázdna hodnota nepridá žiadny.
GEOLOCATION_RATELIMIT_OWNER=app
GEOLOCATION_GOOGLE_RATELIMIT=50
GEOLOCATION_GOOGLE_RATELIMIT_PER=second
GEOLOCATION_IPINFO_RATELIMIT=60
GEOLOCATION_IPINFO_RATELIMIT_PER=minute
GEOLOCATION_IPINFO_RATELIMIT_MAX_WAIT=2000   # fail fast instead of waiting more than 2 s

Čakať alebo rýchlo zlyhať

Predvolene limiter počká, kým sa okno uvoľní, a potom odošle. Ak nastavíte max_wait (v milisekundách), volanie radšej rýchlo zlyhá: keď by odklad prekročil strop, vyhodí sa RateLimitExceededException. Dedí z GeolocationException, nesie ->provider a implementuje kontrakt HasRetryAfter z toolkitu:

use RoundlyConsulting\Geolocation\Exceptions\RateLimitExceededException;

try {
    $location = Geolocation::locateIp($request->ip());
} catch (RateLimitExceededException $e) {
    $e->provider;   // e.g. 'ipinfo'

    return response('Location lookup is busy, please retry.', 429)
        ->header('Retry-After', (string) $e->retryAfterSeconds());
}

Pri zapnutom adaptive nastaví Retry-After z odpovede 429 limiter pre ďalšie volanie, pričom samotná neúspešná odpoveď sa stále zmení na null a pipeline pokračuje.

Hromadná práca

batch() aj distanceMatrix() idú cez rovnaký limiter, takže hromadné vyhľadávania sa automaticky spomalia podľa limitu poskytovateľa.

Spoločné limity pre viac workerov

Balík na limity predvolene používa úložisko v pamäti — jeden limit na proces, čo stačí pre jeden worker alebo beh v CLI. Pre kvótu účtu zdieľanú medzi workermi a servermi ho v jeho vlastnej konfigurácii nasmerujte na zdieľané úložisko (HTTP_CLIENT_RATE_LIMITS_STORE); tento balík žiadne nevynucuje:

// config/http-client-rate-limits.php — one budget across every worker and server
'store' => \RoundlyConsulting\HttpClientRateLimits\Store\RedisStore::class,

Natívne ->retry(times, delay) Laravelu naďalej platí pre prechodné chyby spojenia — limiter je dodatočná vrstva na tempo odchádzajúcich požiadaviek, nie náhrada.

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.