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.

Ключові принципи
  • Суворий 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.