Через Http::pool() або Http::batch() - запити відправляються одночасно, загальний час близький до найдовшого, а не до суми.
$responses = Http::pool(fn (Pool $pool) => [
$pool->as('rates')->timeout(3)->get('https://api.example.com/rates'),
$pool->as('news')->timeout(3)->get('https://api.example.com/news'),
$pool->as('weather')->timeout(3)->get('https://api.example.com/weather'),
]);
$rates = $responses['rates']->json();
batch() додає колбеки:
Http::batch(fn (Batch $batch) => [
$batch->get('https://api.example.com/a'),
$batch->get('https://api.example.com/b'),
])->then(fn (Batch $batch, array $results) => /* усі успішні */)
->catch(fn (Batch $batch, $key, $response) => /* один з помилкою */)
->send(); // або ->defer() - виконати після відповіді користувачу
Що враховувати:
- кожен запит у пулі налаштовують окремо - спільні заголовки не успадковуються від зовнішнього виклику;
- аргумент
concurrencyобмежує одночасні запити, щоб не впертися в ліміт стороннього API; - результат з помилкою - це
Responseз 5xx або виняток з'єднання в масиві, перевіряють кожен; poolне замінює чергу: якщо результат не потрібен відповіді, краще поставити завдання.
Для паралельного виконання довільного PHP-коду, а не HTTP, - Concurrency::run().