The most dangerous phrase in the language is "We've always done it this way."
— Grace Hopper

RFC-процесс TrueAsync

TrueAsync продвигает возможность изменения ядра PHP с помощью RFC.

Главный RFC
Новый RFCDraft

Async Scheduler Hook API

Автор: Edmond [HT]v0.1PHP 8.x

Механизм активации конкурентного выполнения на уровне ядра PHP. Ядро PHP предоставляет специальные хуки, которые позволяют вынести реализацию Scheduler'а в независимое расширение или даже в код на PHP.

Ключевые принципы
  • Строгий opt-in: нулевые накладные расходы, пока планировщик не зарегистрирован
  • Совместимость с Fiber: существующий код на Fiber продолжает работать, а файберы подхватываются планировщиком
  • Continuation: симметричное переключение контекста A→B поверх машинерии Fiber
  • Единая точка регистрации: SchedulerHook::register() включает конкурентность во всём движке
  • Изоляция контекста корутин: раздельные пользовательский и внутренний контексты
  • Свобода экосистемы: ядро стандартизирует только активацию и интерфейс планировщика, а spawn() / await() / каналы остаются за реализацией
Читать RFC на GitHub
Мотивация

Зачем PHP встроенная асинхронность

PHP остаётся одним из последних крупных языков без встроенной поддержки конкурентного выполнения на уровне языка. В Python есть asyncio, JavaScript построен на событийном цикле, в Go есть горутины, в Kotlin есть корутины. PHP по-прежнему работает в парадигме «один запрос на один процесс», хотя большинство реальных приложений проводят основную часть времени в ожидании I/O.

Проблема фрагментации

Сегодня асинхронность в PHP живёт в расширениях: Swoole, AMPHP, ReactPHP, у каждого своя экосистема с несовместимыми API.

  • Каждое расширение переписывает свои драйверы MySQL / PostgreSQL / Redis
  • Библиотека для Swoole не работает с AMPHP, и наоборот
  • Нельзя сделать функции ядра (file_get_contents, curl_exec) неблокирующими
  • Высокий порог входа: нужно освоить целую отдельную экосистему

Решение: хук в движке

TrueAsync добавляет стандартный шов для конкурентности на уровне движка PHP.

  • Прозрачность: синхронный код работает в корутинах без изменений
  • Без «цветных» функций: не нужно размечать async/await
  • Единый стандарт: один интерфейс планировщика в движке для всех расширений
  • Обратная совместимость: существующий код продолжает работать

Типичное PHP-приложение (Laravel, Symfony, WordPress) проводит 70–90% времени в ожидании I/O. С корутинами это время простоя используется эффективно:

Сценарий
Без корутин
С корутинами
3 запроса к БД по 20 мс
60 мс
~22 мс
HTTP + БД + файл
последовательно
параллельно
10 вызовов API
10 × задержка
~1 × задержка
Практические сценарии
Веб-серверы · FrankenPHP, RoadRunnerAPI Gateway · параллельная агрегацияФоновые задачи · конкурентные очередиРеальное время · WebSockets, стриминг
История

Ранние RFC

Эти два RFC описывали полную модель конкурентности прямо в ядре. Новый подход опирается на их идеи, но выносит пользовательский API за пределы ядра, оставляя в движке только точку подключения планировщика.

RFC #1Draft

PHP True Async

Автор: Edmond [HT]v1.7PHP 8.6+

RFC, определяющий модель конкурентности для PHP. Описывает корутины, функции spawn() / await() / suspend(), объект Coroutine, интерфейсы Awaitable и Completable, кооперативную отмену, интеграцию с Fiber, обработку ошибок и graceful shutdown.

Ключевые принципы
  • Минимум изменений в существующем коде для включения конкурентности
  • Корутины сохраняют иллюзию последовательного выполнения
  • Автоматическое переключение корутин при I/O-операциях
  • Кооперативная отмена, «cancellable by design»
  • Стандартный C API для расширений
Читать RFC на wiki.php.net
RFC #2Draft

Scope и структурная конкурентность

Автор: Edmond [HT]v1.0

Расширение RFC True Async. Вводит класс Scope, привязывающий время жизни корутин к лексической области видимости. Описывает иерархию scope'ов, распространение ошибок, политику «зомби»-корутин и критические секции через protect().

Что решает
  • Предотвращение утечки корутин за пределы scope
  • Автоматическая очистка ресурсов при выходе из scope
  • Иерархическая отмена: отмена родителя отменяет все дочерние
  • Защита критических секций от отмены
  • Обнаружение дедлоков и self-await
Читать RFC на wiki.php.net

Как связаны эти RFC

Первый RFC определяет низкоуровневые примитивы: корутины, базовые функции и C API для расширений. Второй RFC добавляет структурную конкурентность: механизмы управления группами корутин, которые делают конкурентный код безопасным и предсказуемым.

RFC #1: True Async
RFC #2: Scope
Уровень
Примитивы
Управление
Что даёт
spawn(), await(), Coroutine
Scope, TaskGroup, protect()
Аналогии
Go goroutines, Kotlin coroutines
Kotlin CoroutineScope, Python TaskGroup
Цель
Запуск конкурентного кода
Безопасное управление жизненным циклом

Участие в обсуждении

RFC обсуждаются в рассылке internals@lists.php.net и на GitHub Discussions. Также присоединяйтесь к обсуждению в Discord.