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_limiterresponde con429y la cabeceraRetry-After.staticadmite ahora configurar la caché y añade el comandorr reset static. - gRPC. Server reflection a través de Protoreg y detalles de
google.rpc.Statusen 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/slogde 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.
/livezy/readyzfuncionan como alias de/healthy/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:
| Área | Qué ha cambiado |
|---|---|
| HTTP middleware | La petición recorre http.middleware de izquierda a derecha. Para conservar el orden anterior, invierte la lista. |
| HTTP/2 | HTTP/2 sin TLS (cleartext) solo funciona con prior knowledge. Upgrade: h2c deja de estar soportado. |
| AMQP | La configuración del broker pasa a conexiones con nombre y se elimina config.version. |
| Logger | Se 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. |
| Tracing | Se elimina el exportador nativo de Zipkin. Usa OTLP. |
| RPC | Goridge v4 no soporta MessagePack. Están disponibles JSON, protobuf, Gob y raw. |
| Jobs | La cabecera pool queda reservada para enrutar a un pool con nombre. El valor por defecto de pipeline_size pasa a ser 100000. |
| NATS | Al detener un pipeline, el stream se conserva por defecto. |
| Centrifuge | Se elimina el método centrifuge.RateLimit. |
envfile | El envfile de la raíz se carga sin necesidad del modo experimental. El fichero indicado tiene que existir. |
server.on_init.env | Sus valores sobrescriben las variables de entorno heredadas. |
| Plugin TCP | No 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 despiral/*yroadrunner-php/*). - Los namespaces de las clases no cambian, para mantener la retrocompatibilidad.
- Cada paquete nuevo declara un
replacedel nombre antiguo conself.version. La excepción es el metapaquete, del que hablamos a continuación. - El metapaquete
spiral/roadrunnerpasa a llamarseroadrunner/roadrunner. Los paquetesroadrunner/*requierenroadrunner/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.0como vulnerable, y eso impedía instalar RoadRunner 3 con Composer. Con el nombre nuevo, ese lastre desaparece.
- 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
- 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.
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.

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