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.
net/rpc across TCP, Unix sockets, or pipes. In practice it arrives transitively with roadrunner/roadrunner. Treat it as an architectural enabler of the worker-runtime decision, not a standalone dependency debate. (The "0 dependents" figure on Packagist is misleading — it is pulled in through the RoadRunner metapackage, not required directly. Note that as of 4.5.0 the package is published as roadrunner/goridge, so the new Packagist entry restarts its dependent/download counters at zero; that is a naming artifact, not a signal about adoption.) The 4.6.0 change to require roadrunner/roadrunner instead of spiral/roadrunner confirms the ecosystem-wide namespace consolidation is proceeding — useful corroboration if anyone still doubts the rename is permanent.MsgpackCodec and the Frame::CODEC_MSGPACK constant are on a removal path. For a PM this converts "which codec do we use?" from a low-stakes engineering preference into a roadmap item with a deadline attached. The practical answer is JSON for small, debuggable calls and Protobuf where we want schema-typed, compact payloads. If any current or planned workload depends on MsgPack, put the migration in the same ticket as the RoadRunner upgrade rather than letting it surface as a breakage. Choosing Protobuf is not free — it implies owning .proto files, codegen in CI, and a schema-evolution policy, which is a process commitment, not a library flag.[]byte transfer, streaming output (v3.2.0), multi-relay async RPC (v4.2.0), and Protobuf support are the capabilities that unlock specific use cases (large file/stream transfer, fire-and-forget notifications, schema-typed calls). If our use case is small JSON-shaped calls, we need none of the advanced surface — which keeps the integration small.spiral/* → roadrunner/* migration has now happened in two waves: the package itself in 4.5.0, and the RoadRunner dependency constraint in 4.6.0. Treat "we have no spiral/goridge or spiral/roadrunner references anywhere" as a single clean-up acceptance criterion rather than two separate tasks — check Composer constraints, lockfiles, CI caches, SBOM/licence allowlists, Dockerfiles, and internal docs. Budget an hour or two of engineering time, not a sprint. The 4.6.0 bug fix also means that when ext-msgpack is absent, MsgpackCodec pulls in the userland rybakit/msgpack package — if we run any MsgPack path, that's a new transitive dependency appearing in our SBOM, which is another reason to just get off MsgPack.Adopt (or rather, accept it as part of the stack) when:
net/rpc-compatible methods and want PHP to call it without an HTTP/gRPC layer in between.ext-sockets or pipes.Look elsewhere when:
roadrunner/roadrunner), meaning your upgrade cadence is coupled to theirs. The rename into the roadrunner/ namespace improves the ownership signal — it is now unambiguously a first-party RoadRunner component rather than a sibling-brand package — but it does not widen the contributor base. Modest bus-factor consideration remains; mitigate by pinning versions and keeping the integration behind our own interface.Migration notes (engineering action, PM owns the sequencing):
roadrunner/goridge (or let the metapackage pull it) and re-run the suite; the codec API is unchanged, so the work is dependency hygiene, not code.MsgpackCodec and CODEC_MSGPACK in our code and in any Go peer. If there are zero hits, note it and move on — this release is a no-op for us. If there are hits, schedule a switch to JsonCodec (if payloads are small) or Protobuf (if we need compact/typed), and add a test that pins the wire format so the swap doesn't silently change behaviour.roadrunner/roadrunner, not spiral/roadrunner. The old name is on a deprecation path; if it's still in a lockfile or Dockerfile, fold it into the same clean-up ticket.spiral/* strings, and decide in advance whether rybakit/msgpack (the fallback dependency) is acceptable if it ever appears.One-liner: Goridge is the free, MIT-licensed plumbing that lets our PHP code call Go code in-process-fast instead of over HTTP — it comes bundled with RoadRunner, so the decision to make is about the runtime, not this library. (It now ships as roadrunner/goridge, and as of 4.6.0 its MsgPack codec is deprecated; if we're on JSON we do nothing.)
For executives: No purchase, no license cost, no new vendor. The strategic value is optionality: it lets us move our slowest workloads into Go one at a time, behind existing interfaces, without rewriting the product or standing up a new service mesh. The cost isn't the library — it's the operational maturity to run a second language runtime and keep its versions in step with ours. The recent releases are administrative: the namespace consolidation under the RoadRunner brand is a small positive for accountability, and the MsgPack deprecation is a routine modernization that costs us nothing if we're on JSON and one small scheduled task if we're not. Approve it as part of a worker-runtime decision with a defined pilot workload, not as a line item.
For engineering: It's a small, focused codec with a clean abstraction (Relay for transport, RPC for calls, pluggable codecs). Supports TCP, Unix sockets, and stdio pipes; binary and streamed payloads; structured service/message/transport error handling. Constraints to design around: PHP 8.1+, ext-sockets or pipes, no built-in auth/TLS, and a version cadence tied to RoadRunner releases. Wrap it behind an internal client interface so we can swap transports (or fall back to HTTP) without touching call sites, and pin both ends. Changed in 4.6.0: MsgpackCodec and Frame::CODEC_MSGPACK are deprecated — standardize on JSON for small calls and Protobuf where we need compact typed payloads (accepting the .proto/codegen/schema-evolution overhead that implies), and remove MsgPack references rather than starting new ones. When ext-msgpack is missing the codec now falls back to the userland rybakit/msgpack; verify whether that lands in our dependency tree. The package now requires roadrunner/roadrunner rather than spiral/roadrunner, so finish the namespace clean-up across lockfiles, CI caches, SBOM/allowlists, and docs in the same pass.
What not to promise: don't quote the 300k calls/sec benchmark as a product improvement. Promise "removes a network hop and a serialization layer on the specific workloads we move," and put a number on it only after a benchmark on our own payloads. Don't present the namespace moves as features or maturity milestones — they're housekeeping with a short maintenance tail. And don't describe the MsgPack deprecation as a capability loss; present it as the codec set settling on the two options we'd have chosen anyway.
How can I help you explore Laravel packages today?