> Напишите функцию, которая асинхронно сделает fetch-запрос, распарсит ответ и вернет имя пользователя (PHP)

Уровень: senior · Роль: backend · Язык: PHP · Категория: Технические вопросы

Компании: витринатв

Стек: PHP

> Пример ответа

В PHP для асинхронных HTTP-запросов можно использовать библиотеку Guzzle с поддержкой Promises, либо встроенные функции с curl_multi_*. Вот пример с Guzzle, который является стандартом индустрии:

PHP
<?php
require '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(), но это значительно сложнее и менее удобно.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью