Если вы хоть раз писали
$client->request('GET', ...) и $response->toArray(), значит, уже пользовались symfony/http-client.Для простых случаев этого хватает.
Но реальность другая:
– 100 API-эндпоинтов нужно получить за секунды, а не минуты
– JSON на 500 МБ не должен взорвать память
– API периодически “флапает”, а приложение должно выжить
– токен OAuth2 живёт 60 минут — и должен обновляться сам
💡 И тут выясняется, что
HttpClient — не просто обёртка над curl, а мощный инструмент для сложных систем.⚡️ 1. Конкурентные запросы через stream()
Обычный
foreach делает запросы последовательно:10 запросов × 300 мс = 3 сек.
С
stream() всё иначе — запросы идут параллельно, и общее время ≈ самому медленному из них.foreach ($productIds as $id) {
$responses[$id] = $client->request('GET', "products/$id");
}
foreach ($client->stream($responses) as $r => $chunk) {
if ($chunk->isLast()) $prices[] = $r->toArray()['price'];
}👉 10 запросов за ~300 мс вместо 3 секунд.
🧠 2. Потоковый парсинг JSON (новинка Symfony 7.3)
symfony/json-streamer позволяет читать огромные JSON-файлы без загрузки их целиком в память.composer require symfony/json-streamer
foreach ($streamReader->read($response, Type::list(Type::object(ProductDto::class))) as $product) {
// обработка 2 млн объектов без OutOfMemory
}🧱 3. Надёжность: Retry + Circuit Breaker
RetryableHttpClient сам повторит запросы при 503/504.А если API “упало” — кастомный
CircuitBreakerClient отключает обращения на 60 секунд, чтобы не “молотить мёртвый сервис”.🔐 4. Автоматический OAuth2
AccessTokenHttpClient берёт токен из кэша и обновляет его по необходимости.Больше никаких ручных проверок
if ($token->isExpired()).🧪 5. Тестирование без сети
MockHttpClient с генератором позволяет точно проверить последовательность и данные запросов.Тесты становятся детерминированными и быстрыми.
🔗 Ссылка на статью
🐸 Библиотека пхпшника