roadrunner-php/laravel-bridge
Laravel Bridge for RoadRunner integrates the high-performance RoadRunner application server with Laravel. It bootstraps Laravel per worker and supports HTTP, queues, logging, metrics, and PSR-7 responses for faster, persistent-worker apps.
What this package is: roadrunner-php/laravel-bridge is the official integration layer between Laravel and RoadRunner (a Go-based PHP application server), plus optional Temporal workflow support. It replaces the php-fpm request lifecycle with long-lived PHP workers and supplies Laravel-native adapters for RoadRunner's queue (jobs), KV cache store, and gRPC/HTTP worker modes. Release 6.6.2 is a patch release: seven bug fixes, a docs refresh, and a PHPStan-max refactor. No declared breaking changes.
Architecture fit: Strong fit where the driver is throughput, latency, or durability of long-running work — high-RPS APIs, queue-heavy workloads, and services that need durable orchestration (Temporal). Poor fit for teams unwilling to own worker-lifecycle semantics: the application must be safe in a persistent-process model (no leaked singletons, no per-request globals, no assumptions about process isolation), and the runtime is no longer a stock php-fpm container. This is an infrastructure decision as much as a library decision.
Integration feasibility: Composer-installable with Laravel package auto-discovery; configuration is split between Laravel config and RoadRunner's .rr.yaml, and requires the RoadRunner Go binary in the deployment image. Feasible in a sprint for a small service; 4–8 weeks end-to-end for a production service including load testing, runbook work, and rollback rehearsal. The Temporal path is materially more work and should be treated as a separate initiative.
Technical risk (informed by 6.6.2):
release() delay is now correctly converted to seconds. Any code that compensated for the previous (incorrect) unit will silently change retry cadence. This is a fix, but it is a behavioral change on a patch version.WorkerOptions::$maxTries === null now falls back to 10. Jobs that previously ran with an unbounded/unknown try count will now stop after 10 attempts. Confirm this matches your intended policy before upgrading.$backoff is now honored on failed-job release, and failing jobs without an exception are handled. Both improve reliability but change retry timing and failure classification versus prior behavior.Key questions:
.rr.yaml, and worker sizing as a standing operational responsibility?Stack fit: Targets Laravel applications running PHP 8.2+ who want an alternative to php-fpm + Nginx and, optionally, a Redis-free queue/cache path. Best value where the app already leans on Laravel queues or where Temporal-style durable workflows are on the roadmap. Low value for small, low-traffic apps — the operational surface outweighs the performance win.
Migration path:
6.6.2 explicitly; do not float ^6.6.Compatibility: Verify the Laravel/PHP support matrix in composer.json rather than the README. Audit for php-fpm assumptions: $_SERVER/$_ENV mutations, static caches, container singletons holding request state, register_shutdown_function usage, and filesystem-based session/cache drivers. Note that Horizon is Redis-specific and does not manage RoadRunner queues — if Horizon is central to your operations tooling, that is a gap to plan for. Third-party packages that assume process-per-request are the most common source of surprises.
Sequencing:
Maintenance: Active release cadence with small, focused patch releases — good for security and correctness, but it means behavior can shift on patch versions (as 6.6.2 shows). Pin versions, subscribe to releases, and treat upgrades as small change-managed events rather than routine composer update noise. Budget roughly one engineer-day per quarter for upgrades and validation.
Support: Community-supported open source with a small maintainer pool — bus-factor risk is real. No vendor SLA unless procured separately. Mitigate by keeping the integration surface thin (don't build custom drivers on top of internals) and by documenting your .rr.yaml and worker configuration in-repo so it isn't tribal knowledge.
Scaling: Scales horizontally by adding worker processes/containers; the Go server handles connection management and balancing. The binding constraint shifts from CPU-per-request to per-worker memory ceiling and worker count. Size workers against peak memory with headroom, set explicit max_jobs/memory limits to force recycling, and load test with the real payload distribution rather than synthetic pings.
Failure modes to instrument:
Ramp-up: Moderate to high. Expect 2–4 weeks before a mid-level engineer is productive and 1–2 months before the team can debug worker-lifecycle issues unaided. Required knowledge: RoadRunner worker model and .rr.yaml, Laravel container lifecycle in long-lived processes, queue retry/backoff semantics, and — if used — Temporal workflow/activity concepts. Front-load a short internal walkthrough and a one-page runbook covering restart, memory alerts, and rollback.
Recommendation: Adopt 6.6.2 for new or queue-heavy Laravel services where worker-safety can be audited up front. Treat the delay-unit and max-tries changes as behavioral, not cosmetic — validate both in staging before production. Defer the Temporal integration until the HTTP/queue path is stable in production.
How can I help you explore Laravel packages today?