Что произойдет при вызове асинхронной функции без await?
Что проверяют
Понимаете ли, что в самом PHP ключевых слов async и await нет, и умеете ли объяснить, как асинхронность в PHP устроена на самом деле. Вопрос часто задают формулировкой из мира JavaScript, и пересказ про JavaScript здесь считается за минус.
Как отвечать
Начать с уточнения, о каком стеке речь. В языке есть файберы: корутина, которую можно приостановить и возобновить, это примитив, а не готовая асинхронность. Событийный цикл и промисы даёт библиотека: ReactPHP, Amp, Swoole. Именно её правила определяют ответ.
В библиотеке на промисах вызов без ожидания вернёт объект промиса, а работа будет поставлена в очередь событийного цикла. Код пойдёт дальше, результата ещё нет. Следствий два, и оба неприятные: результат некому принять, а отказ промиса без обработчика либо потеряется молча, либо всплывёт как необработанная ошибка.
$promise = $client->request('GET', $url);
$promise->then($onSuccess, $onError); // без второго колбэка ошибка теряетсяВ библиотеке на файберах вызов запускает функцию в отдельном файбере и возвращает будущее значение, а ожидание этого значения возвращает управление в цикл. Без ожидания код всё равно отработает, пока цикл жив, но исключение вы увидите не в том месте, где рассчитывали.
Где спотыкаются
Считают, что вызов без ожидания даёт параллелизм. Цикл однопоточный: есть чередование задач на точках ожидания, и только. Один блокирующий вызов, обычный file_get_contents или синхронный драйвер базы, останавливает весь цикл вместе со всеми задачами.
Второе: применяют приём «запусти и забудь» в обычном веб-запросе под PHP-FPM. Процесс завершится сразу после ответа, и незавершённая работа просто не доедет. Для фоновых задач нужна очередь и отдельный воркер.
Третье: не следят за ошибками. Код с обработчиком только на успех выглядит рабочим, а при сбое сети молчит: ни лога, ни падения, ни ответа. Обработчик отказа обязателен, а в файберном стиле обязателен try/catch вокруг ожидания.