PHP y el asincronismo real: TrueAsync y la revolución del rendimiento

Durante décadas, PHP ha sido sinónimo de simplicidad, fiabilidad y velocidad de desarrollo. Pero también ha cargado con una limitación estructural, su modelo bloqueante de ejecución.

Hace dos meses, en el artículo PHP asíncrono, exploramos cómo el lenguaje, tradicionalmente bloqueante, podía transformarse gracias a librerías y extensiones como Swoole o ReactPHP, capaces de introducir event loops y corutinas en entornos donde cada milisegundo cuenta.

Aquel texto cerraba con una idea clara:

“El futuro de PHP no está en abandonar lo aprendido, sino en ampliar sus capacidades para responder a las demandas del presente.”

Hoy, ese futuro ha llegado.

Con la primera alpha release de TrueAsync PHP, integrada directamente en NGINX Unit, la programación asíncrona deja de ser un “hack” o una extensión opcional. Por primera vez, PHP incorpora un modelo de ejecución verdaderamente concurrente, nativo y pensado para entornos de alto rendimiento.

Artículos recomendados antes de seguir con la lectura:

https://itdo.com/blog/php-asincrono/

https://itdo.com/blog/optimizar-php-para-el-uso-de-multiples-procesadores-parallelism-concurrency-y-scalable-architectures/

https://itdo.com/blog/guia-definitiva-para-escalar-y-optimizar-php-en-produccion/

El cambio de paradigma: de FPM a corrutinas nativas

Durante décadas, PHP ha funcionado bajo un principio simple: una petición = un proceso.

Ese modelo, heredado de CGI y FPM, ha sido suficiente para la web de los 2000, pero hoy, con APIs, microservicios y streaming en tiempo real, es una traba para la escalabilidad.

TrueAsync rompe ese esquema y ahora un solo proceso puede atender múltiples peticiones simultáneamente, gracias a un sistema interno de corutinas y E/S no bloqueante.

En otras palabras, PHP ya puede comportarse como Node.js o Go, pero manteniendo su ecosistema y simplicidad.

Arquitectura TrueAsync: tres capas, un mismo flujo

Para entender el alcance de TrueAsync, conviene ver cómo se integra PHP dentro de NGINX Unit. El nuevo modelo se apoya en tres niveles de ejecución que trabajan juntos para convertir cada petición HTTP en una tarea asíncrona, sin bloquear al resto.

1. Capa interna: Integración en C

Aquí es donde NGINX Unit se conecta directamente con el motor de PHP. Esta capa registra un nuevo SAPI asíncrono (Server API) y crea una corutina por cada petición entrante.

Se encarga del bucle de eventos (nxt_unit_run()) y del envío de datos no bloqueante (nxt_unit_response_write_nb()).

En otras palabras, es el motor que gestiona la concurrencia real.

2. Capa intermedia: Extensión PHP (NginxUnit)

Encima de ese motor, NGINX Unit expone una extensión PHP con un espacio de nombres propio (NginxUnit). Esta capa traduce las operaciones de bajo nivel a objetos y métodos que como desarrollador puedes usar, algunas como:

  • NginxUnit\Request → representa la petición HTTP.
  • NginxUnit\Response → permite escribir respuestas sin bloquear el proceso.
  • NginxUnit\HttpServer::onRequest() → registra la función que manejará cada solicitud.

Actúa como un puente entre el runtime interno y tu aplicación PHP.

3. Capa superior — Tu aplicación (entrypoint.php)

Finalmente, en tu script principal defines cómo responder a las peticiones. Aquí usas la API de NginxUnit para procesar solicitudes, enviar datos y finalizar respuestas de forma totalmente asíncrona.

Este archivo es el punto de entrada de la aplicación, equivalente al index.php tradicional, pero pensado para un entorno event-driven.

Ejemplo de configuración con NGINX Unit

Aqui tienes el proyecto de ejemplo listo (Ubuntu/Debian)

A partir de aquí, nos centramos en cómo escribir código PHP que aproveche el modelo asíncrono (corutinas + I/O no bloqueante) y qué cambiar en tu forma de diseñar endpoints.

Endpoints incluidos:

  • GET / → JSON con saludo, método, URI y timestamp
  • GET /stream → salida chunked para testear el async
  • GET /slow?ms=500 → simula el I/O tradicional “lento” con un “sleep” cooperativo y devuelve JSON

Smoke tests (comprobar que responde): # Endpoint raíz → JSON con saludo + timestamp curl -s http://127.0.0.1:8080/ | jq .

# Streaming por chunks → verás que se van imprimiendo líneas curl -sN http://127.0.0.1:8080/stream

# Lento simulado → ajusta latencia con ?ms=. time curl -s http://127.0.0.1:8080/slow?ms=800 | jq .

Prueba de concurrencia con wrk: wrk -t4 -c100 -d30s http://127.0.0.1:8080/

La comunidad PHP reacciona

El anuncio de TrueAsync generó una de las conversaciones más activas en años dentro de la comunidad PHP. 

Algunos fragmentos destacados del hilo:

“This RFC leads to PHP operating in two modes: Blocking mode vs Concurrent mode… maybe Fiber will become legacy.” — Nicolas Grekas (Symfony)

“My reaction to this can be summed up as ‘this is huge!’ … PHP having native async support would be a huge step forward.”

“A nicer API should use only explicit cancellation objects… pre-emptive implicit cancellations are super dangerous IMO.”

Estas opiniones resumen el entusiasmo y los desafíos del cambio.

Conclusión

PHP acelera su futuro, TrueAsync no es una simple optimización, es un cambio de paradigma.

Si en septiembre hablábamos de cómo librerías externas podían llevar a PHP al terreno asíncrono, hoy estamos frente a la integración nativa de ese concepto. 

El modelo bloqueante que definió a PHP durante 25 años está dando paso a una nueva generación de aplicaciones concurrentes, ligeras y escalables.

Como decía en aquel primer artículo:

“El futuro de PHP no está en abandonar lo aprendido, sino en ampliar sus capacidades.”

Hoy podemos afirmarlo con certeza que ese futuro ya está aquí y corre en paralelo.

Referencias:

True Async PHP is Here! First Alpha Release Unleashes a New Era for High-Performance Apps

PHP Internals (Externals.io) — RFC: TrueAsync for PHP (Message #126537)·

NGINX Unit Official Docs — PHP language module & asynchronous mode