1. Архитектура асинхронного PHP: Fibers и Event Loop
Архитектура асинхронного PHP: Fibers и Event Loop
Почему PHP-приложение, обрабатывающее 500 запросов в секунду, съедает 16 ГБ оперативки, а аналогичное на Go — всего 512 МБ? Ответ кроется не в языке, а в модели выполнения. Классический PHP-FPM создаёт отдельный процесс на каждый запрос — инициализация, выполнение, завершение, уничтожение. Даже если скрипт 90% времени ждёт ответа от базы или API, процесс висит в памяти и блокирует ядро. Асинхронный PHP ломает эту парадигму: один процесс обслуживает сотни соединений одновременно, переключаясь между ними в моменты ожидания I/O.
Fibers: легковесные стеки выполнения
Fibers — это примитив, появившийся в PHP 8.1, позволяющий приостанавливать и возобновлять выполнение кода вручную. В отличие от потоков (threads), Fibers не используют планировщик ОС — переключение происходит полностью в пользовательском пространстве, что делает его мгновенным.
Fibers + Event Loop: практическая интеграция
Магия происходит, когда Fiber приостанавливается в момент I/O-операции, а Event Loop возобновляет его, когда данные готовы. Вот минимальная реализация асинхронного HTTP-запроса:
``php
use Revolt\EventLoop;
use Fiber;
function asyncFetch(string fiber = Fiber::getCurrent(); url); curl_setopt(ch, CURLOPT_FOLLOWLOCATION, true); // Неблокирующий режим curl_setopt(result = ''; EventLoop::defer(function () use (fiber, &result = curl_exec(fiber->resume(fiber1 = new Fiber(function () { return asyncFetch('https://api.example.com/users'); });
fiber1->start();
_GET, $_POST, статические свойства классов — всё это общее между запросами в долгоживущем процессе. Каждый запрос должен быть изолирован: передавайте данные через параметры, а не через глобалы.