baldinof/roadrunner-bundle
Symfony bundle that integrates the RoadRunner high-performance PHP application server, providing an easily configurable, extendable worker with middleware support, kernel reboots, and out-of-the-box integrations for Sentry, sessions, Doctrine, Blackfire, and Xdebug.
on_exception, always, max_jobs with dispersion, memory threshold, and combinations) are genuinely product-facing knobs. They encode a decision about how much degraded-worker risk you'll tolerate in exchange for performance: on_exception + an allowed_exceptions allowlist is the "trust the app" position; always is the "correctness over speed" fallback; max_jobs + memory are the pragmatic leak-containment defaults. A PM can set the policy and let engineering implement it declaratively.WorkerStart, WorkerStop, WorkerException, WorkerKernelRebooted) give you hooks for alerting on worker churn. Worker reboots are a silent performance cliff; being able to alert on reboot frequency is the difference between "we adopted this and it's fine" and "we adopted this and latency mysteriously doubled."rr get-binary to /usr/local/bin, EXPOSE 8080, CMD ["rr","serve"]), and the Runtime integration means minimal bootstrap changes..rr.yaml alongside your Symfony config. No ops maturity, no adoption.ResetInterface on stateful services, session handling, Doctrine connection health). The default_integrations: false escape hatch exists but is explicitly discouraged — treat it as a red flag, not a plan..rr.dev.yaml watch mode and the fact that FPM remains a viable rollback path make this reversible: run it in staging on one service, measure, decide.For executives: We can increase request throughput and cut per-request cost on our Symfony services without rewriting application code. This is an MIT-licensed adapter that lets Symfony run inside RoadRunner, a Go-based application server — the practical effect is that PHP stops paying its bootstrap tax on every request. Cost is contained: no license fee, no vendor lock-in, and a reversible rollout (we can pilot one service and fall back to our current setup). The risks are operational rather than product: it adds a Go binary to our deployment footprint and requires discipline around long-running-process state, which the package partially manages for us via configurable kernel-reboot policies and built-in Sentry/Doctrine/session handling. One clarification up front: this is Symfony-only — if the service in question is Laravel, the equivalent decision is Octane, and this package is out of scope.
For engineering: This is the smallest correct amount of code to run Symfony as a persistent RoadRunner worker. The kernel and container persist across requests; the bundle reboots them on exceptions, and you choose the strategy — on_exception with an allowed_exceptions allowlist for well-understood domain/HTTP exceptions, max_jobs with dispersion (e.g. 1,000 ± 20%) to bound leaks, and/or a memory threshold (default 128 MB) — and strategies compose. Session, Sentry scope, Doctrine ORM connection health and manager clearing, Mongo managers, Blackfire, and Xdebug trigger mode are handled out of the box. Middleware is supported via MiddlewareInterface, but note it runs outside Kernel::handle() and the stack resolves once at worker start, so don't expect per-request kernel services there. Also budget for auditing stateful services and implementing ResetInterface — that audit, not the install, is the real work. Metrics (Prometheus), gRPC service auto-registration, and a RoadRunner KV cache adapter are available if we want them.
Decision requested: Approval for a time-boxed pilot on one non-critical Symfony service — benchmark against FPM, implement ResetInterface on flagged services, wire reboot-strategy config and reboot-frequency alerting, then report latency, cost-per-request, and incident delta before any broader rollout.
How can I help you explore Laravel packages today?