spiral/goridge
Goridge is a high-performance PHP-to-Golang IPC bridge and codec library that lets PHP call Go service methods over TCP, Unix sockets, or pipes, with JSON/msgpack structured data and []byte support, minimal overhead, and native net/rpc integration.
Architecture fit Unchanged at the architectural level: Goridge is a transport/codec layer, not a framework. It plugs in as the wire protocol between a Laravel/PHP application and one or more Go services, and it fits where the product already has (or plans) a Go sidecar, worker, or service — especially under RoadRunner. It remains a poor fit as a standalone "RPC framework." 4.6.0 does, however, narrow the shape of the fit: with MsgPack deprecating, the package's codec story collapses toward JSON plus Protobuf/binary, which is fine for RPC-shaped request/response but is a real consideration if anyone was drawn to Goridge specifically for cheap binary payloads. Realistic usage stays "Laravel app calls a Go compute service over Unix socket or pipes."
Integration feasibility
Install remains composer require roadrunner/goridge on PHP 8.1+ for the v4 line; the PHP surface (Relay::create(), RPC::call(...)) is unchanged, so a spike is still hours, not sprints. Two new integration costs land in 4.6.0. First, the internal requirement moved from spiral/roadrunner to roadrunner/roadrunner — the org rename has now propagated into the runtime dependency, not just our own composer.json, which means the cutover sweep has to cover the entire RoadRunner family (roadrunner-cli, roadrunner-http, worker packages, CI images, Dockerfiles). Second, MsgpackCodec and Frame::CODEC_MSGPACK are deprecated, so any payload design we do now should not target MsgPack. Integration cost still sits on the Go side: build or wrap a net/rpc-compatible service, match the Goridge Go module version, define the payload contract — and now also confirm the Go peer is not MsgPack-only.
Technical risk
MsgpackCodec and Frame::CODEC_MSGPACK are deprecated. Code keeps working at 4.x (deprecation, not removal), but the forward path is JSON or Protobuf. Our prior guidance named MsgPack as the choice for binary/large payloads — that recommendation is now stale and must be replaced before Phase 2 contract lock-in. The open question is the removal horizon: a v5 that deletes the constant is a hard runtime break for anyone who shipped MsgPack frames, and it interacts badly with the PHP↔Go symmetry requirement, since the Go module's timeline may differ from the PHP package's.MsgpackCodec with rybakit/msgpack when ext-msgpack is absent. Useful if we are already on MsgPack and running without the extension, but do not build on it — the fallback exists to keep a deprecated codec limping, not as a supported performance path.spiral/roadrunner → roadrunner/roadrunner inside the package means the rename is a stack-wide event. Anything pinned, mirrored, SBOM'd, or allowlisted under spiral/* needs auditing, not just the Goridge requirement itself.spiral/goridge → roadrunner/goridge. Does the new package replace/provide the old one; does the old name still receive releases; did the Goridge\ PHP namespace change or only the Composer name. If both names remain installable with a shared namespace, a monorepo can install duplicate code or collide.roadrunner/roadrunner. Major upgrades (v3 → v4) were breaking; pin explicitly and treat upgrades as planned work.Key questions
spiral/goridge or spiral/roadrunner anywhere in the estate? What is the cutover plan, and do the old names still get security fixes during our transition window?roadrunner/roadrunner requirement change is an immediate install-graph issue, not a future one.Stack fit
Unchanged for Laravel 10/11 on PHP 8.1+, RoadRunner (or equivalent long-running worker model), and a Go service over Unix sockets (lowest latency, simplest failure isolation) or pipes (suits RoadRunner worker topology). TCP relays ease container/Kubernetes networking but add a hop and TLS/firewall surface. Codec guidance changes: JSON becomes the default for debuggability and schema evolution, Protobuf for binary/large or latency-sensitive payloads, and MsgPack is removed from the decision set for any new work. Note that the ext-msgpack-optional story is no longer a reason to pick Goridge — codec optionality is shrinking, not growing.
Migration path
spiral/goridge→roadrunner/goridge and spiral/roadrunner→roadrunner/roadrunner. Update composer.json, regenerate the lockfile, refresh CI/composer caches, private Satis/Packagist mirror entries, Docker layer caches, SBOM/allowlist entries, and internal docs and snippets. Add a smoke test asserting exactly one Goridge implementation and exactly one RoadRunner family is installed.net/rpc echo service, called from a Laravel command over Unix socket and over pipes; measure p50/p99 and failure behavior. Run it in JSON and Protobuf, not MsgPack. Confirm codec symmetry. Fold in a read of the 4.3–4.5 changelogs here.Compatibility
PHP 8.1+ for the v4 line; PHP 7.x only on v3-and-below (out of scope). Match the Goridge Go module to the PHP major version. One codec per service, documented — and the allowed set is now JSON and Protobuf. Mixed codecs per relay work but multiply the test matrix, and mixing in a deprecated codec multiplies it with an expiry date. Windows works but is not a production target for a Laravel deployment. Rename compatibility remains the open item for both package names: verify alias, replace, or deprecated-and-frozen before committing to a cutover date.
Sequencing
spiral/*→roadrunner/* impact on our runtime) and confirm namespace stability — this is the first gate.roadrunner/roadrunner requirement lands on us immediately.composer.json and go.mod, add both to the upgrade calendar.Maintenance
Two runtimes, two dependency graphs, two upgrade streams, and now two package names in circulation across the ecosystem — plus a second rename one layer down. Goridge itself stays low-maintenance (small surface, stable API at v4), but its version is coupled to RoadRunner's release train — a RoadRunner upgrade can force a Goridge upgrade can force a Go module upgrade — and that chain is now visible in composer.json rather than implicit. Add the rename sweep to the backlog and budget the recurring quarterly alignment task. Add a codec-hygiene item: a periodic grep for MsgpackCodec / CODEC_MSGPACK / ext-msgpack so deprecated usage does not silently accumulate between majors. CI must build and test both PHP and Go halves. We still own the integration; the org move makes internal ownership more defensible to stakeholders but does not transfer it.
Support
Primary maintainers are the Spiral/RoadRunner team, now publishing under the roadrunner-php org — a clearer support surface and a modest de-risking of the "will this be maintained" question. Velocity supports that read: 4.6.0 landed nine days after 4.5.0 with a fix and a deprecation rather than a stall. Community support remains the RoadRunner Discord; no formal SLAs, and no published deprecation-to-removal SLA either — which is why the MsgPack timeline has to be asked for rather than assumed. Plan for internal ownership of the integration plus a documented escalation path into the RoadRunner project. MIT license and a small codebase keep fork-and-patch viable, but only if someone on the team reads PHP and Go — and note a fork would now inherit the deprecated codec, so a fork is a maintenance liability on the codec axis too.
Scaling
Unchanged and unaffected by 4.6.0. The "300k calls/sec over 20 threads" figure is raw protocol throughput on a benchmark rig, not application throughput. Real limits come from Go service concurrency, PHP worker count under RoadRunner/FPM, and relay connection topology. Default RPC is single-relay and synchronous; concurrency comes from many PHP workers each holding a relay, or the MultiRPC async relay. Plan connection counts per worker, socket backlog, and file-descriptor limits. Large binary payloads still work but need memory sizing on both sides — and the practical way to move them is now Protobuf or JSON-with-binary-encoding, not MsgPack, which may change size/CPU budgets on the Go side and should be re-measured in the spike rather than carried over from prior assumptions.
Failure modes
spiral/roadrunner break the build at the worst time — after an unrelated upgrade, because the requirement changed inside Goridge. Fix during Phase 0a, not during an incident.spiral/goridge and others on roadrunner/goridge can install two copies of the same code, or collide if the namespace is shared. Assert on the dependency tree in CI.Ramp-up
Engineers still need roughly a week to be productive with the Goridge PHP API and one to two weeks on the Go net/rpc side (more with no Go exposure). Documentation was refreshed in 4.5.0 and 4.6.0 keeps the package current, which helps — but older blog posts, StackOverflow answers, and internal snippets now show both the wrong composer require line and MsgPack codec examples that are deprecated on arrival. Onboarding material must be updated deliberately to steer new engineers to JSON/Protobuf; the examples/ directory is still the de facto reference and should be checked for MsgPack samples before it is handed to a new hire. Produce an internal runbook covering relay selection, codec choice and change policy, timeout/retry semantics, the PHP↔Go contract test process, and the package-name policy before Phase 2; that runbook, more than the library itself, determines whether the integration stays cheap.
How can I help you explore Laravel packages today?