Послідовні запити складають свої затримки: три запити по 400 мс - 1,2 секунди. Якщо вони незалежні, їх можна виконати одночасно - і чекати лише найповільніший.
use Illuminate\Http\Client\Pool;
use Illuminate\Support\Facades\Http;
$responses = Http::pool(fn (Pool $pool) => [
$pool->as('rates')->get('https://api.example.com/rates'),
$pool->as('stock')->withToken($token)->get('https://warehouse.example.com/stock/42'),
$pool->as('delivery')->timeout(5)->get('https://delivery.example.com/estimate', ['city' => 'Київ']),
]);
$rates = $responses['rates']->json();
Особливості пулу:
- заголовки й налаштування - на кожному запиті в пулі:
Http::withHeaders(...)->pool(...)не застосується до запитів усередині; as()дає доступ до відповідей за назвою, без нього - за індексом у порядку додавання;- помилки не кидаються: невдалий запит повертає відповідь з кодом помилки, а збій з'єднання - об'єкт винятку на місці відповіді. Перевіряйте кожен результат:
$response instanceof Response && $response->successful().
Обмеження паралельності - якщо запитів багато:
$responses = Http::pool(fn (Pool $pool) => collect($skus)
->map(fn ($sku) => $pool->as($sku)->get("https://api.example.com/products/{$sku}"))
->all(), concurrency: 5);
Без обмеження сотня запитів піде одночасно - і провайдер відповість 429 або заблокує ключ.
Http::batch() - схожий механізм з колбеками before, progress, then, catch, finally - зручно для відстеження прогресу й обробки окремих збоїв.
Коли пул доречний:
- кілька незалежних джерел для однієї сторінки чи розрахунку (курси, залишки, доставка);
- масове оновлення даних у джобі - з
concurrencyпід ліміт провайдера.
Чого пул не вирішує:
- сумарне навантаження: паралельність прискорює ваш процес, але не зменшує кількість запитів до провайдера;
- ліміти частоти - для тисяч запитів потрібна черга з
RateLimited, а не один гігантський пул; - довгі операції в запиті користувача - навіть паралельно, три запити по 5 секунд - це 5 секунд очікування. Такі речі - у фоні.
Альтернатива поза HTTP-клієнтом - Concurrency::run() для паралельного виконання довільних замикань (окремі процеси), коли треба розпаралелити не лише HTTP.