Skip to content
RoadRunner 3

Ya está aquí RoadRunner 3 ​

Nos alegra anunciar que hemos publicado RoadRunner 3.

RoadRunner 3 será la última versión mayor durante mucho tiempo y llega con una API muy estable. Para esta versión hemos cerrado el backlog pendiente de las versiones anteriores y hemos recuperado un esquema de versionado claro: dejamos atrás las versiones basadas en calendario y volvemos a SemVer. RoadRunner 3 seguirá recibiendo correcciones de errores y parches de seguridad, pero a partir de ahora el equipo dedica la mayor parte de su esfuerzo a Rapira.

A continuación repasamos qué ha cambiado en el servidor y en los paquetes PHP, y cómo actualizar.

Principales novedades ​

La lista completa está en las notas de la versión. Lo más destacado:

  • Plugins incluidos en la build estándar. Se añaden el driver de colas NSQ, rate limiting para HTTP, compresión Zstd y el registro de protobuf (Protoreg). Se elimina el plugin TCP.
  • HTTP. Soporte de PROXY protocol v1 y v2 con una lista explícita de proxies de confianza. El middleware rate_limiter responde con 429 y la cabecera Retry-After. static admite ahora configurar la caché y añade el comando rr reset static.
  • gRPC. Server reflection a través de Protoreg y detalles de google.rpc.Status en los logs de errores.
  • Jobs. Pools de workers con nombre: un pipeline se puede asignar a su propio pool de workers PHP. AMQP admite conexiones con nombre a distintos brokers. Kafka puede consumir solo las particiones que elijas.
  • Lock. Nuevo backend de Redis para compartir locks entre varias instancias de RoadRunner.
  • Logger. El logger usa ahora log/slog de Go y la escritura en la salida ya no es bloqueante.
  • Sockets Unix. Puedes definir permisos, propietario y grupo para los listeners y para el relay de los workers.
  • Status. /livez y /readyz funcionan como alias de /health y /ready.

Cambios incompatibles ​

La lista detallada, paso a paso, está en la guía de migración de v2025 a v3. Lo más relevante:

ÁreaQué ha cambiado
HTTP middlewareLa petición recorre http.middleware de izquierda a derecha. Para conservar el orden anterior, invierte la lista.
HTTP/2HTTP/2 sin TLS (cleartext) solo funciona con prior knowledge. Upgrade: h2c deja de estar soportado.
AMQPLa configuración del broker pasa a conexiones con nombre y se elimina config.version.
LoggerSe eliminan file_logger_options y la rotación integrada. Usa output y una herramienta de rotación externa. Si la cola se llena, se descartan las entradas nuevas.
TracingSe elimina el exportador nativo de Zipkin. Usa OTLP.
RPCGoridge v4 no soporta MessagePack. Están disponibles JSON, protobuf, Gob y raw.
JobsLa cabecera pool queda reservada para enrutar a un pool con nombre. El valor por defecto de pipeline_size pasa a ser 100000.
NATSAl detener un pipeline, el stream se conserva por defecto.
CentrifugeSe elimina el método centrifuge.RateLimit.
envfileEl envfile de la raíz se carga sin necesidad del modo experimental. El fichero indicado tiene que existir.
server.on_init.envSus valores sobrescriben las variables de entorno heredadas.
Plugin TCPNo está soportado en RoadRunner 3.

En la raíz de .rr.yaml se sigue indicando version: "3". Para compilar desde el código fuente hace falta Go 1.27 o superior. Quienes desarrollen plugins en Go tienen que migrar a api-go/v6, api-plugins/v6, pool/v2, goridge/v4 y *slog.Logger. El builder Velox usa una nueva configuración de módulos y pierde el servidor de build remoto y los targets de Windows. Aun así, la release incluye binarios precompilados para Windows.

Paquetes PHP ​

Los paquetes PHP se han actualizado junto con el servidor. Lo principal:

  • La versión mínima de PHP es la 8.2.
  • Todos los paquetes pasan al nuevo vendor roadrunner/* (en lugar de spiral/* y roadrunner-php/*).
  • Los namespaces de las clases no cambian, para mantener la retrocompatibilidad.
  • Cada paquete nuevo declara un replace del nombre antiguo con self.version. La excepción es el metapaquete, del que hablamos a continuación.
  • El metapaquete spiral/roadrunner pasa a llamarse roadrunner/roadrunner. Los paquetes roadrunner/* requieren roadrunner/roadrunner ^3.0. Con el cambio de nombre nos quitamos de encima varios problemas:
    • Las versiones de calendario 2023.x–2025.x, que no siguen SemVer, aparecían una y otra vez como las últimas versiones estables. CalVer se queda en spiral/roadrunner.
    • El advisory CVE-2025-22871 marca spiral/roadrunner < 2025.1.0 como vulnerable, y eso impedía instalar RoadRunner 3 con Composer. Con el nombre nuevo, ese lastre desaparece.
  • Todos los paquetes requieren RoadRunner 3. No garantizamos que las versiones antiguas de RoadRunner funcionen con los paquetes nuevos.
  • El plugin TCP se ha eliminado de RoadRunner 3. Si tu aplicación usa el plugin TCP, te recomendamos quedarte en RoadRunner v2025. Esto no afecta al transporte tcp:// para RPC y para el relay de los workers, que sigue funcionando igual que antes.

Además, hemos pulido varios detalles:

  • Los tests se han reescrito con Testo.
  • Han mejorado las métricas de code coverage, mutation testing y análisis estático.
  • RoadRunner CLI 3.0.0 descarga los binarios con DLoad.
Nombre antiguoNombre nuevoEstado
spiral/roadrunnerroadrunner/roadrunnerVersión
spiral/roadrunner-workerroadrunner/workerVersión Psalm Cobertura MSI
spiral/roadrunner-httproadrunner/httpVersión Psalm Cobertura MSI
spiral/roadrunner-grpcroadrunner/grpcVersión Psalm Cobertura MSI
spiral/roadrunner-jobsroadrunner/jobsVersión Psalm Cobertura MSI
spiral/roadrunner-kvroadrunner/kvVersión Psalm Cobertura MSI
spiral/roadrunner-metricsroadrunner/metricsVersión Psalm Cobertura MSI
spiral/roadrunner-servicesroadrunner/servicesVersión Psalm Cobertura MSI
spiral/goridgeroadrunner/goridgeVersión Psalm Cobertura MSI
spiral/roadrunner-cliroadrunner/cliVersión Psalm Cobertura MSI
roadrunner-php/app-loggerroadrunner/app-loggerVersión Psalm Cobertura MSI
roadrunner-php/centrifugoroadrunner/centrifugoVersión Psalm Cobertura MSI
roadrunner-php/lockroadrunner/lockVersión Psalm Cobertura MSI
roadrunner-php/symfony-lock-driverroadrunner/symfony-lock-driverVersión Psalm Cobertura MSI
roadrunner-php/version-checkerroadrunner/version-checkerVersión Psalm Cobertura MSI
roadrunner-php/roadrunner-api-dtoroadrunner/api-dtoVersión

Para migrar, cambia los nombres y las versiones de los paquetes en composer.json.

Aún más estable ​

RoadRunner ya ofrecía la integración con PHP más fiable posible: ¿qué hay más estable que STDIN/STDOUT? Aun así, en la versión 3 encontramos margen de mejora: el consumo de memoria es ahora más uniforme y el rendimiento ha vuelto a subir un poco.

Consumo de memoria de RoadRunner v2025, RoadRunner v3 y el dispatcher de Rapira con carga creciente

Sin embargo, si necesitas el máximo rendimiento en endpoints HTTP o gRPC, quizá haya llegado el momento de probar Rapira.

Actualizado: