Ответ
Стандартный PHP для веб-запросов является синхронным и блокирующим. Однако для реализации асинхронных операций существует несколько подходов и инструментов:
-
Библиотеки на основе event-loop: ReactPHP и Amp. Они позволяют писать неблокирующий код, похожий на Node.js.
// Пример с ReactPHP $loop = ReactEventLoopFactory::create(); $loop->addTimer(2.0, function () { echo "Выполнено после 2 секунд.n"; }); $loop->run(); -
Расширение Swoole: Предоставляет полноценный асинхронный, корутиновый движок для PHP, позволяющий создавать высокопроизводительные сетевые приложения.
-
Генераторы и корутины: С помощью
yieldможно реализовать кооперативную многозадачность для управления несколькими задачами в одном процессе. -
Очереди сообщений: Для фоновой обработки задач в веб-приложениях чаще всего используются очереди (RabbitMQ, Redis, Beanstalkd) в сочетании с отдельными worker-процессами (например, через Symfony Messenger или Laravel Queues).
Основное применение: Асинхронные подходы в PHP наиболее востребованы для CLI-скриптов, высоконагруженных микросервисов или обработки фоновых задач, в то время как традиционные веб-запросы остаются синхронными.
Ответ 18+ 🔞
Боже, ну вот смотри, PHP для веб-запросов — он как старый, добрый, но упоротый трактор. Запустил скрипт — и он тупо ждёт, пока всё по цепочке не сделает, блокируя всё на своём пути. Синхронный, блядь, и блокирующий. Но иногда же надо, чтобы оно не тупило, а делало несколько дел сразу, как будто у него овердохуища рук? Так вот, есть способы его заставить.
Первый способ — библиотеки с event-loop'ом, типа ReactPHP или Amp. Это когда ты пишешь код, который не блокируется, а ждёт, когда ему ответят, и в это время может делать другую хуйню. Прям как в Node.js, только на PHP, что само по себе звучит как «хуй в пальто».
// Пример с ReactPHP
$loop = ReactEventLoopFactory::create();
$loop->addTimer(2.0, function () {
echo "Выполнено после 2 секунд.n";
});
$loop->run();
Смотри, создаёшь петлю, говоришь ей: «Через две секунды сделай вот это», а она тебе: «Окей, босс, я пока другие дела поделаю, если будут». Удобно, но голова сначала может ебеться, пока привыкнешь к такому стилю.
Второй способ — расширение Swoole. Вот это, ёпта, уже серьёзно. Это не библиотечка, а целый асинхронный движок с корутинами, который из твоего PHP делает зверя для сетевых приложений. Производительность там просто пиздец какая. Но это уже другой уровень, нужно вникать.
Третий способ — генераторы и корутины. Используешь оператор yield, и в одном процессе можешь переключаться между разными задачами, как будто жонглируешь. Кооперативная многозадачность называется. Хитрая жопа, но мощная, если разобраться.
Четвёртый способ — и самый, наверное, распространённый в обычных веб-приложениях — очереди сообщений. RabbitMQ, Redis, Beanstalkd. Суть проста: твой веб-скрипт быстро кидает задачу в очередь и говорит «да похуй», а где-то в фоне отдельный worker-процесс (на том же PHP, кстати) эту очередь мониторит и задачи выполняет. В Laravel это Queues, в Symfony — Messenger. Красота, а не жизнь. Веб-сервер не тупит, пользователь не ждёт, а тяжёлая работа идёт себе в фоне.
Так где же это всё применять? Асинхронность в PHP — это не для каждой простой странички-визитки. Это для CLI-скриптов, которые должны много чего параллельно обработать, для высоконагруженных микросервисов, где каждый миллисекунд на счету, или для тех самых фоновых задач в больших приложениях. А обычный веб-запрос так и остаётся синхронным, потому что часто проще и надёжнее. Выбирай инструмент под задачу, а не гонись за модой, чувак.