Mempelajari protokol Goridge sebagai tulang punggung komunikasi Go dan PHP: memakai package spiral/goridge untuk memanggil method plugin dari PHP, dan membuka jalur sebaliknya dengan service RPC kustom.

Di episode 2 kita menyebut Goridge sebagai jembatan Go↔PHP. Pada episode kali ini kita benar-benar melewati jembatan itu: memahami RPC RoadRunner dan memakai package spiral/goridge untuk komunikasi dua arah. Ini adalah fondasi dari semua plugin (KV, jobs, metrics, gRPC) yang akan kalian pakai di episode-episode berikutnya.
Mengapa episode ini penting? Karena begitu kalian paham RPC, plugin-plugin RoadRunner bukan lagi kotak hitam — kalian tahu persis bahwa kv.Get(), jobs.Push(), dan metrics.Inc() semuanya berjalan di atas mekanisme yang sama yang akan kita bedah sekarang.
RoadRunner membuka port RPC (default tcp://127.0.0.1:6001) yang dipakai aplikasi PHP untuk memanggil method yang disediakan plugin di sisi Go. Alurnya:
plugin.Method (misal kv.Get).Port RPC dikonfigurasi di blok rpc:
rpc:
listen: tcp://127.0.0.1:6001spiral/goridgeUntuk memanggil method plugin dari PHP, gunakan package spiral/goridge:
composer require spiral/goridgeContoh pemanggilan method RPC sederhana:
<?php
use Spiral\Goridge\RPC\RPC;
$rpc = RPC::create('tcp://127.0.0.1:6001');
// Set TTL 30 detik untuk method service_ready
$rpc->withServicePrefix('health')->withTimeout(30);
// Memanggil method "check" pada service "health"
$result = $rpc->call('health.check', ['healthy' => true]);
var_dump($result);Detail yang perlu dipahami:
RPC::create($address) membuat koneksi ke port RPC. Bisa juga memakai Unix socket (unix://...) untuk keamanan lokal.$rpc->call('health.check', $payload) memanggil method check pada service health dengan payload JSON.stdClass/array PHP.withTimeout() membatasi durasi tunggu agar worker tidak menggantung saat RPC lambat.Dalam praktik nyata kalian jarang memakai $rpc->call() langsung. Package seperti spiral/roadrunner-kv, spiral/roadrunner-jobs, dan spiral/roadrunner-metrics adalah wrapper di atas RPC yang menyediakan API yang nyaman. Misalnya memanggil KV:
use Spiral\RoadRunner\KeyValue\Factory;
$cache = (new Factory($rpc))->select('redis');
$cache->set('cart:42', $payload, 3600);
$value = $cache->get('cart:42');Di balik layar, set() ini mengirim kv.Set ke server Go. Wrapper hanya menyembunyikan serialisasi dan nama method. Episode 10-12 akan memakai pola ini untuk KV, queue, dan metrics.
RPC tidak satu arah. Kalian bisa mendaftarkan method PHP agar bisa dipanggil dari Go, memakai Spiral\RoadRunner\RPC\ServiceInterface:
<?php
use Spiral\RoadRunner\RPC\ServiceInterface;
final class HealthService implements ServiceInterface
{
public function check($args): array
{
return ['status' => 'ok', 'time' => time()];
}
}Lalu daftarkan ke RPC server di dalam worker:
$rpc = RPC::create('tcp://127.0.0.1:6001');
$rpc->withService(new HealthService());Setelah worker menjalankan kode ini, service health.check bisa dipanggil oleh server Go — misalnya dari plugin kustom Go (episode 23) atau oleh proses lain yang terhubung ke port RPC. Ini membuka pola menarik: Go men-delegate komputasi berat ke pool PHP, dan PHP men-delegate infrastruktur ke Go.
Warning
Port RPC tanpa otentikasi adalah permukaan serangan: siapa pun yang bisa menjangkau tcp://127.0.0.1:6001 bisa memanggil method plugin. Jangan expose port RPC ke publik. Untuk lingkungan multi-proses, pertimbangkan Unix socket (unix://rr.sock) atau firewall ketat — detail hardening di episode 17.
Masalah RPC paling umum dan solusinya:
| Gejala | Kemungkinan Penyebab | Solusi |
|---|---|---|
connection refused | Plugin rpc tidak aktif / port salah | Pastikan blok rpc ada dan alamat cocok |
unknown method kv.Get | Plugin KV belum dikonfigurasi | Tambah blok kv (episode 10) |
| Call timeout | Worker macet atau port RPC overload | Perbesar withTimeout, cek beban pool |
| Decode error | Payload tidak sesuai skema method | Periksa tipe data argumen |
Pada episode 7 ini, kalian telah melewati jembatan Goridge.
Inti yang harus dibawa pulang:
spiral/goridge menyediakan RPC::create() dan $rpc->call().Di episode 8 selanjutnya, kita masuk ke middleware & pipeline — membangun middleware HTTP seperti logging, auth, dan CORS, menyusun pipeline yang rapi, serta menggabungkan middleware RoadRunner level Go dengan middleware PHP. Sampai jumpa di episode 8!