spiral/roadrunner
RoadRunner is a high-performance PHP application server and process manager written in Go. It offers HTTP/2/3, gRPC, fCGI, queues, KV storage, and OpenTelemetry via plugins, serving as a powerful alternative to Nginx+FPM.
v3.0.1 is a security patch, not a feature release — treat it as mandatory hygiene. It rebuilds on Go 1.27.3 to fix CVE-2026-111943 / GO-2026-6809 in crypto/x509: certificate verification now rejects known untrusted intermediate certificates. Two PM-relevant consequences: (1) if we adopt v3, we should pin >= 3.0.1, not 3.0.0 — shipping a known-vulnerable binary to production is not a defensible default; (2) the fix changes TLS verification behavior, so anything in the worker that terminates or validates TLS against an unusual certificate chain (internal CAs, self-signed intermediates, legacy brokers, mTLS to a payment or identity provider) should be re-verified in staging, not assumed. Ask the vendor/upstream explicitly whether a v2025.x equivalent patch exists — if we stay on the old line, we need the security answer for that line too, not just a stability answer.api, api-go/v6, api-plugins/v6, pool/v2, goridge/v4, log/slog). That is good hygiene for upstream, but it reclassifies "we'll write a custom plugin" from a small extension task to a maintained dependency on a moving API. Decide explicitly: consume stock plugins only (recommended), or accept ongoing porting cost. This is a build-vs-buy decision inside the buy.429 + Retry-After), Zstd response compression, PROXY protocol v1/v2 with explicit trusted proxies, configurable trusted forwarding headers, and static-file serving controls (prefixes, metadata/missing-file cache TTLs, cache limits, rr reset static) into the default container. This is a real PM lever: abuse mitigation, bandwidth cost, correct client-IP attribution behind a load balancer, and offloading static traffic without writing middleware.pool header) plus outcome metrics (success/failed/requeued via rr_jobs_jobs_requeue) and trace continuity for jobs submitted over RPC. That means you can offer a "priority/beta pipeline" without new infrastructure, define queue SLOs, and get end-to-end traces through async work — a concrete observability win for any feature with background processing.ack_wait and changes stream retention semantics. Translation for roadmap: "we can use the platform team's existing broker and least-privilege credentials" is now a supported answer.google.rpc.Status error details in failed unary-call logs materially reduce the cost of internal gRPC services — reflection alone unlocks grpcurl/tooling workflows and cuts a class of "how do I even call this locally" support tickets.dynamic_allocator.max_workers now counted above the base pool, with retry-after-scale-up) rather than more FPM children.spiral/roadrunner is the low-level worker SDK; practical entry points are Laravel Octane, the Symfony Runtime, and spiral/roadrunner-cli. Don't read "0 dependents" on the bare SDK as an adoption signal.Decision this release creates: what is our patch floor? v3.0.1 is the first maintenance release on the v3 line and it exists purely to close a Go stdlib CVE. That establishes the operating model: pin a minimum patch (currently 3.0.1), not just a major, and re-verify the binary checksum on every bump. The earlier scheduling recommendation stands — stay on v2025.x for the current quarter unless a v3 capability unblocks a committed roadmap item — but with one addition: confirm the v2025.x line's security posture before treating "stay put" as the safe option. A stability argument for staying is not a security argument for staying.
Adopt (or continue adopting) when most of these hold:
.rr.yaml config, worker restart/memory policies, a major-version upgrade treadmill, and a security-patch cadence.Specifically consider v3 when you need:
Look elsewhere when:
$_SESSION semantics, or libraries that leak memory across requests. Long-lived workers turn these into incidents, not code smells.Non-negotiable pre-adoption checklist (unchanged): load test against your FPM baseline, state-leakage audit, worker memory/restart policy, rollback path to FPM.
Non-negotiable v3 upgrade checklist:
>= 3.0.1, not 3.0.0. v3.0.0 carries a known Go crypto/x509 CVE; do not let an early pin calcify at the vulnerable patch.http.middleware list to preserve behavior. Treat this as a silent behavioral change: diff the effective order and add a test for auth-before-routing and similar ordering assumptions.config.version removed; static pipelines require config.connection with nested exchange and queue. Rewrite queue configs before cutover and verify declaration rights under least-privilege accounts.Upgrade: h2c is gone; use prior-knowledge H2C. Verify every internal client (service mesh, older SDKs, health checkers) that relied on upgrade.crypto/x509 behavior. The patch rejects known untrusted intermediate certificates. Test every outbound/inbound TLS dependency the workers touch — internal CA, broker mTLS, third-party APIs, SSO — in staging before the bump, and have a rollback patch ready.github.com/roadrunner-server/roadrunner/v3); if you embed or custom-build, confirm the plugin API ports (api-go/v6, api-plugins/v6, pool/v2, log/slog) and rebase onto Go 1.27.3+ so the CVE fix is retained. Note TCP now requires a custom build.To executives — the one-liner: RoadRunner is a drop-in application server that replaces our Nginx + PHP-FPM layer with a single MIT-licensed binary, and v3 adds the edge and queue features we'd otherwise buy separately — rate limiting, compression, proxy-aware client IPs, queue prioritization and metrics, and gRPC tooling. The trade-off is a planned major-version migration plus an ongoing runtime patch cadence — not an unplanned one, and the first patch (v3.0.1) is a security fix we should take.
The business case:
v2025.x while we plan, then upgrade deliberately — and we now know patches ship within days of a relevant CVE (v3.0.0 → v3.0.1 for a crypto/x509 Go advisory). Exit cost stays low — MIT, PSR-7/PSR-17 interfaces, first-class Laravel/Symfony integration.To engineering — the honest framing:
crypto/x509 fix rather than reintroducing it.envfile is required at startup; AMQP config restructured (config.version removed, nested connection/exchange/queue); and, as of 3.0.1, stricter intermediate-certificate validation — chains that previously "worked" may now be rejected. Add Upgrade: h2c removal and changed NATS retention semantics to the same shortlist.api-go/v6/api-plugins/v6 and must be ported on each major — and rebuilt against patched Go. Default to stock plugins.v2025.x for stability only after confirming that line's patch status for GO-2026-6809; if it is unpatched and unpatchable, that materially raises the priority of the v3 move. In parallel, run a timeboxed v3 spike on one non-critical service (pinned to >= 3.0.1) that exercises HTTP + one queue driver + metrics + a TLS dependency. Go/no-go criteria defined up front: documented migration diff, p95 improvement vs. the FPM baseline, cost per 1k requests, zero state-leakage defects in soak, zero middleware-order regressions in the test suite, clean TLS verification against all dependencies, and a working rollback to both v2025.x and FPM.The ask: (1) a scoped v3 evaluation (2–4 engineer-weeks) on a single service, pinned to 3.0.1; (2) an answer from upstream on the v2025.x security patch path; (3) standing ownership — a named owner for runtime version and security-patch uptake. Decide on data, not on the release notes.
How can I help you explore Laravel packages today?