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

El proceso RFC de TrueAsync

TrueAsync impulsa la posibilidad de cambiar el núcleo de PHP mediante el proceso RFC.

RFC principal
Nuevo RFCDraft

Async Scheduler Hook API

Autor: Edmond [HT]v0.1PHP 8.x

Un mecanismo para activar la ejecución concurrente a nivel del núcleo de PHP. El núcleo expone hooks dedicados que permiten llevar la implementación del planificador a una extensión independiente, o incluso a código PHP.

Principios clave
  • Opt-in estricto: cero sobrecarga hasta que se registra un planificador
  • Compatible con Fiber: el código Fiber existente sigue funcionando, y las fibras son adoptadas por el planificador
  • Continuation: un cambio de contexto simétrico A→B construido sobre la maquinaria de Fiber
  • Un único punto de registro: SchedulerHook::register() activa la concurrencia en todo el motor
  • Aislamiento de contexto por corrutina: contextos de usuario e interno separados
  • Libertad del ecosistema: el núcleo estandariza solo la activación y la interfaz del planificador, mientras que spawn() / await() / los canales quedan a cargo de la implementación
Leer el RFC en GitHub
Motivación

Por qué PHP necesita asincronía integrada

PHP es uno de los últimos lenguajes importantes que aún carece de soporte integrado para la ejecución concurrente a nivel de lenguaje. Python tiene asyncio, JavaScript se basa en un bucle de eventos, Go tiene goroutines, Kotlin tiene corrutinas. PHP sigue en el paradigma «una petición, un proceso», aunque la mayoría de las aplicaciones reales pasan la mayor parte de su tiempo esperando E/S.

El problema de la fragmentación

Hoy la asincronía en PHP vive en extensiones: Swoole, AMPHP, ReactPHP, cada una con su propio ecosistema y APIs incompatibles.

  • Cada extensión reescribe sus propios controladores de MySQL / PostgreSQL / Redis
  • Una biblioteca para Swoole no funciona con AMPHP, y viceversa
  • No se pueden hacer no bloqueantes las funciones del núcleo (file_get_contents, curl_exec)
  • Una alta barrera de entrada: hay que aprender todo un ecosistema aparte

La solución: un hook en el motor

TrueAsync añade una costura estándar para la concurrencia a nivel del motor de PHP.

  • Transparencia: el código síncrono se ejecuta en corrutinas sin cambios
  • Sin funciones de color: sin marcado async/await
  • Un estándar unificado: una interfaz de planificador en el motor para cada extensión
  • Compatibilidad hacia atrás: el código existente sigue funcionando

Una aplicación PHP típica (Laravel, Symfony, WordPress) pasa el 70–90 % de su tiempo esperando E/S. Con corrutinas ese tiempo inactivo se aprovecha de forma eficiente:

Escenario
Sin corrutinas
Con corrutinas
3 consultas a BD de 20 ms cada una
60 ms
~22 ms
HTTP + BD + archivo
secuencial
paralelo
10 llamadas a la API
10 × latencia
~1 × latencia
Escenarios prácticos
Servidores web · FrankenPHP, RoadRunnerAPI Gateway · agregación paralelaTareas en segundo plano · colas concurrentesTiempo real · WebSockets, streaming
Historia

RFCs anteriores

Estos dos RFCs describían un modelo de concurrencia completo integrado directamente en el núcleo. El nuevo enfoque se apoya en sus ideas, pero saca del núcleo la API orientada al usuario y conserva en el motor solo el punto de conexión del planificador.

RFC #1Draft

PHP True Async

Autor: Edmond [HT]v1.7PHP 8.6+

El RFC que define un modelo de concurrencia para PHP. Describe las corrutinas, las funciones spawn() / await() / suspend(), el objeto Coroutine, las interfaces Awaitable y Completable, la cancelación cooperativa, la integración con Fiber, el manejo de errores y el graceful shutdown.

Principios clave
  • Cambios mínimos en el código existente para habilitar la concurrencia
  • Las corrutinas mantienen la ilusión de una ejecución secuencial
  • Cambio automático de corrutinas en las operaciones de E/S
  • Cancelación cooperativa, «cancellable by design»
  • API de C estándar para extensiones
Leer el RFC en wiki.php.net
RFC #2Draft

Scope y concurrencia estructurada

Autor: Edmond [HT]v1.0

Una extensión del RFC True Async. Introduce la clase Scope, que vincula el tiempo de vida de las corrutinas al ámbito léxico. Describe la jerarquía de scopes, la propagación de errores, la política de corrutinas «zombis» y las secciones críticas mediante protect().

Qué resuelve
  • Evitar la fuga de corrutinas más allá del scope
  • Limpieza automática de recursos al salir del scope
  • Cancelación jerárquica: cancelar al padre cancela a todos los hijos
  • Protección de secciones críticas frente a la cancelación
  • Detección de interbloqueos y self-await
Leer el RFC en wiki.php.net

Cómo se relacionan estos RFCs

El primer RFC define primitivas de bajo nivel: corrutinas, funciones base y la API de C para extensiones. El segundo RFC añade concurrencia estructurada: mecanismos para gestionar grupos de corrutinas que hacen que el código concurrente sea seguro y predecible.

RFC #1: True Async
RFC #2: Scope
Nivel
Primitivas
Gestión
Aporta
spawn(), await(), Coroutine
Scope, TaskGroup, protect()
Analogías
Go goroutines, Kotlin coroutines
Kotlin CoroutineScope, Python TaskGroup
Objetivo
Ejecutar código concurrente
Gestión segura del ciclo de vida

Únete a la conversación

Los RFCs se debaten en la lista de correo internals@lists.php.net y en GitHub Discussions. Únete también a la conversación en Discord.