> Напишите функцию, которая асинхронно сделает fetch-запрос, распарсит ответ и вернет имя пользователя (PHP)
Уровень: senior · Роль: backend · Язык: PHP · Категория: Технические вопросы
Компании: витринатв
Стек: PHP
> Пример ответа
В PHP для асинхронных HTTP-запросов можно использовать библиотеку Guzzle с поддержкой Promises, либо встроенные функции с curl_multi_*. Вот пример с Guzzle, который является стандартом индустрии:
PHP<?phprequire 'vendor/autoload.php';use GuzzleHttp\Client;use GuzzleHttp\Promise;use GuzzleHttp\Exception\RequestException;/*** Асинхронно выполняет fetch-запрос, парсит JSON и возвращает имя пользователя.** @param string $url URL для запроса* @return Promise\PromiseInterface промис, который разрешается именем пользователя*/function fetchUserNameAsync(string $url): Promise\PromiseInterface{$client = new Client();// Асинхронный запрос$promise = $client->getAsync($url, ['headers' => ['Accept' => 'application/json'],'timeout' => 5.0]);// Цепочка обработки: парсинг JSON и извлечение имениreturn $promise->then(function ($response) {$data = json_decode($response->getBody(), true);if (json_last_error() !== JSON_ERROR_NONE) {throw new \RuntimeException('Ошибка парсинга JSON: ' . json_last_error_msg());}// Предполагаем, что ответ содержит поле "name"return $data['name'] ?? throw new \RuntimeException('Поле "name" не найдено в ответе');},function (RequestException $e) {throw new \RuntimeException('Ошибка запроса: ' . $e->getMessage());});}// Пример использования:$promise = fetchUserNameAsync('https://api.example.com/user/1');$userName = $promise->wait(); // Блокирует выполнение до получения результатаecho "Имя пользователя: " . $userName;
Ключевые моменты:
- Используется Guzzle для асинхронности (требуется Composer-пакет
guzzlehttp/guzzle) - Функция возвращает промис, который можно разрешить через
wait()или объединить с другими промисами - Обрабатываются ошибки HTTP и парсинга JSON
- Предполагается, что ответ содержит поле
name- при необходимости адаптируйте под свою структуру данных
Для чистого PHP без внешних библиотек можно использовать curl_multi_init(), но это значительно сложнее и менее удобно.
> Похожие задачи по PHP
Какие есть способы оптимизации тяжелых запросов к базе данных
Что такое дедлоки?
Как изменить взаимодействие с внешним сервисом, чтобы избежать увеличения нагрузки из-за ретраев
Как изменить взаимодействие между сервисами, чтобы избежать дублирования заказов при ретраях
> Похожие задачи по backend
Почему вы сменили PHP на Go, что было мотиватором
Что такое дедлоки?
Как изменить взаимодействие с внешним сервисом, чтобы избежать увеличения нагрузки из-за ретраев
Как изменить взаимодействие между сервисами, чтобы избежать дублирования заказов при ретраях
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью