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. Matica vzdialeností rozdelená na viac požiadaviek zaberie v limite jedno miesto za každú požiadavku.

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í, no len pre prechodné chyby: chyba spojenia alebo odpoveď 5xx sa zopakuje najviac toľkokrát, koľko určuje services.<provider>.retry, kým odpoveď 4xx — zlý kľúč, neznáma IP, 429 — sa vráti hneď a znova sa neposiela. Všetky pokusy jedného volania zdieľajú jedno miesto v limite; 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.