Напишите функцию, которая асинхронно сделает fetch-запрос, распарсит ответ и вернет имя пользователя
Что проверяют
Понимаете ли вы, что «асинхронно» в PHP означает не то же самое, что в браузере. Классическая модель PHP-FPM синхронная: процесс обслуживает один запрос от начала до конца. Поэтому вопрос на самом деле про то, чем вы будете распараллеливать сетевые вызовы и как обрабатывать ошибки HTTP и разбора ответа.
Как отвечать
Скажите, что в обычном PHP-приложении асинхронность даёт мультиплексирование curl: Guzzle поверх curl_multi, промисы и ожидание нескольких запросов сразу. Если проект на событийном цикле, есть ReactPHP и AMPHP, а с версии 8.1 корутины строятся на файберах.
function fetchUserName(Client $http, string $url): PromiseInterface
{
return $http->requestAsync('GET', $url, ['timeout' => 5])
->then(static function (ResponseInterface $res): string {
$data = json_decode((string) $res->getBody(), true, 512, JSON_THROW_ON_ERROR);
return $data['username'] ?? throw new RuntimeException('в ответе нет username');
});
}Дальше покажите, зачем это нужно: один промис ничего не ускоряет, выигрыш появляется, когда вы запускаете пачку запросов и ждёте их вместе через Utils::settle($promises)->wait(). Отдельно проговорите таймаут соединения и ответа, повтор только для идемпотентных запросов и ограничение числа одновременных вызовов.
Где спотыкаются
Отвечают кодом на JavaScript. Вопрос звучит знакомо, слово fetch тянет за собой заученный сниппет с async/await, и кандидат на вакансию PHP пишет браузерный код. Это сразу читается как ответ не по своей платформе.
Путают асинхронность с многопоточностью. Промисы Guzzle не создают потоков: работа идёт в одном процессе, и пока вы не вызвали ожидание, запрос может вообще не начаться. Параллельные потоки в PHP это уже отдельные процессы или расширение parallel, и говорить про них как про то же самое нельзя.
Забывают про ошибки двух видов. Guzzle по умолчанию бросает исключение на коды 4xx и 5xx, а json_decode без флага строгости молча вернёт null на битом теле, и функция отдаст пустое имя вместо понятной ошибки. Нужны и проверка статуса, и строгий разбор, и осмысленное поведение при отсутствии поля.