roadrunner/goridge
Goridge is the high-performance PHP-to-Go communication layer behind RoadRunner. It offers fast binary payload packing and RPC transport over sockets and pipes, letting PHP workers exchange data efficiently with the Go server. Lightweight and battle-tested.
What this release is. 4.6.0 is the first release since the rebrand with actual code surface change. Three entries: deprecation of MsgpackCodec and Frame::CODEC_MSGPACK; a bug fix that initializes MsgpackCodec with rybakit/msgpack when ext-msgpack is absent; and a second package-identity rename, spiral/roadrunner → roadrunner/roadrunner, in the package's own requirements. The first two are one story — the optional msgpack codec is now on a removal path, and its fallback implementation was just patched. The third extends the naming cascade begun in 4.5.0 beyond this library.
Correction to the 4.5.0 assessment. Two statements there are now stale and should not be carried forward: "no deprecation of a public class is disclosed" — there is one now, of a public class and a public class constant; and "runtime risk is flat, dependency-management risk is not" — still accurate for the default codec, but no longer the whole picture. The wire protocol itself is unchanged; a codec selector within it is now deprecated.
What msgpack is here, and who cares. Goridge frames carry a codec byte in their options field. Frame::CODEC_MSGPACK tells both ends to msgpack-encode the payload instead of passing raw bytes — and it only matters if the PHP side sets that codec and the RoadRunner Go server agrees. The default Octane topology almost certainly uses the raw/bytes codec, so the deprecation is a non-event for the mainstream path. It bites exactly the direct-consumer scenarios the prior assessment told you to prototype last: custom workers, custom relay clients, protocol-level tooling. Also determine what replaces it. If the recommendation is "serialize at the application layer and use the raw codec," migration is cheap. If it's "a new codec," that's a wire-level coordination exercise with the Go binary. Don't guess.
The ext-msgpack fallback. The fix implies msgpack is no longer hard-wired to the extension: without ext-msgpack, the class falls back to rybakit/msgpack (pure PHP). Three consequences: a path that previously failed at startup now runs, so latent fallback bugs surface as production behavior; if rybakit/msgpack is a hard require rather than a suggest, a new package enters your vendor tree and SBOM; and pure-PHP msgpack is meaningfully slower per payload than the extension. Net effect for anyone using msgpack: two possible implementations of the same codec depending on host configuration.
The second rename. require roadrunner/roadrunner instead of spiral/roadrunner is almost certainly a dev-only or self-test dependency (binary-downloader/CLI lineage), not something your application resolves at runtime — but verify rather than assume with composer why spiral/roadrunner across the estate. Either way it is the second identity-keyed artifact in nine days, and it confirms the pattern: the whole roadrunner-* family is mid-rebrand on its own schedule, independent of Octane's.
Architecture fit. Unchanged: entirely transitive via laravel/octane → roadrunner-http/roadrunner-worker → this package. Score high for "must be present and healthy," near-zero for "should we build on it." The msgpack deprecation sharpens the corollary — the more you touch the codec layer directly, the less this stays an invisible dependency. Stay on the default codec and 4.6.0 costs you nothing.
Integration feasibility. Still trivial to install and framework-agnostic. Naming remains the hard part and got harder: three package names are now in motion (spiral/goridge → roadrunner/goridge, spiral/roadrunner → roadrunner/roadrunner, plus whatever Octane's constraints say). The split-brain hazard from 4.5.0 stands — until replace: spiral/goridge is confirmed and dual install is ruled out, treat any direct pin as unsafe.
Technical risk.
CODEC_MSGPACK is a wire-contract change if anything still emits it, and it would land alongside a RoadRunner binary compatibility question. Low likelihood of affecting you, high cost if it does — worth a 30-minute check now rather than an unattended composer update later.rybakit/msgpack can differ in behavior and performance across environments.composer audit policies keyed to the old name.roadrunner-* ↔ RoadRunner Go binary) unchanged, still the dominant runtime risk.ext-sockets for SocketRelay, socket path/permission drift in containers, unauthenticated TCP port if misconfigured, hung recv presenting upstream as 502s.Key questions before adopting or upgrading.
Frame::CODEC_MSGPACK or otherwise opt into msgpack? Grep the constant, the string, and custom worker bootstraps. Answer this first — it's the only item in 4.6.0 with a removal date attached.rybakit/msgpack a require or a suggest, and does ext-msgpack exist in our runtime images? Host-dependent codec behavior is a debugging tax.roadrunner/roadrunner runtime or dev-only, and does the spiral/roadrunner move affect our binary-download/CLI path?roadrunner/goridge declare replace: spiral/goridge, and does a resolution exist that installs both?laravel/octane, roadrunner-http, roadrunner-worker, and roadrunner-cli migrated to the new names, and what constraints do they carry?spiral/goridge and spiral/roadrunner marked abandoned on Packagist, and where do they point?composer.json pins?Stack fit. Unchanged: Laravel 10/11 + Octane on the RoadRunner driver, default codec, pipes or Unix sockets. Direct use stays narrow, and 4.6.0 narrows it further — opting into msgpack now means opting into a deprecated API plus a host-dependent codec implementation.
Migration path. Same two strategies and the same rule: migrate when something else forces it.
roadrunner-* family have migrated. Bump them together, let the renames arrive transitively, update identity-keyed artifacts in the same change.spiral/goridge has no wire-protocol downside and avoids dual installs.New on top of either: treat the msgpack deprecation as a separate, small workstream. If nothing sets the codec, close it with a line in the ADR and move on. If something does, plan removal before the next major — switch to application-level serialization over the raw codec, verify against the Go binary, then drop the constant. Do not couple this to the rename migration: different clocks, different failure modes.
And do not hand-edit composer.json to swap package names ahead of the constraints that reference them. If a direct dependency ever becomes necessary, put it behind an internal adapter so protocol and codec types never leak into domain code, and record an ADR.
Compatibility notes.
laravel/octane, roadrunner-cli, roadrunner-http, roadrunner-worker — and now roadrunner/roadrunner vs spiral/roadrunner.StreamRelay (pipes) still works without ext-sockets; prefer it for the default Octane topology.Sequencing.
composer why for spiral/goridge/roadrunner/goridge and spiral/roadrunner/roadrunner/roadrunner across every repo; record whether a direct dependency exists anywhere.composer.json for a replace declaration and for how rybakit/msgpack is declared; confirm whether dual-install is even possible.roadrunner-* family; pick Follow or Defer explicitly and write it down.Maintenance. Near-zero when transitive and pinned — but the pin matters more now. A nine-day release cadence is healthy, yet during a rebrand it means constraints and dependency names keep moving underneath you. Track the Go binary first and let Composer follow. The one-time bookkeeping cost of the rename now recurs twice; add both legacy names to the runbook. Still, do not fork: forking a wire protocol is a permanent tax, and forking during a rebrand guarantees you desynchronize from a moving target.
Support. MIT, small maintainer group, GitHub issues, no vendor SLA. Consolidation into the roadrunner-php organization continues to help discoverability, and the 4.6.0 fixes suggest the maintainers actively exercise the codec path — a good sign. Escalation is still community-based. Acceptable for an invisible component; not acceptable as a load-bearing direct dependency without internal expertise. The new wrinkle: a deprecation with no vendor SLA means you own the removal deadline.
Scaling. Unchanged. One relay per worker process; concurrency scales by adding workers, not by multiplexing within a relay. Blocking semantics make worker count and request timeouts the real levers; socket transports add file-descriptor pressure; pipes remain cheapest and most common. One new consideration: msgpack without ext-msgpack encodes in pure PHP and is slower per payload — measure before assuming it's free at high request rates.
Failure modes to instrument for.
roadrunner/spiral binary-package — installs after the renames. Inconsistent framing or autoload surprises across worker pools with no clean error.spiral/*.composer update.recv with no timeout — hung workers that look like app-level slowness.Observability belongs at the Octane/RoadRunner layer and worker stderr, not here.
Ramp-up. Under a day for a PHP engineer to understand the framing API; 2–3 days to become effective at debugging across the PHP/Go boundary. Add both legacy package names plus one line on the msgpack deprecation to the runbook, so the next engineer searching for any of it lands in the right place. The success criterion is unchanged, with one addition: for most teams nobody should ever need to know this package exists, nobody should need to know it used to have a different name — and nobody should first learn about the codec deprecation from a production traceback.
How can I help you explore Laravel packages today?