Membangun binary RoadRunner kustom dengan Velox: memahami struktur plugin Go, menulis plugin sederhana, menyusun config velox.yaml, dan memanggil plugin kustom dari PHP lewat RPC untuk menambah kemampuan di luar plugin bawaan.

Setelah di episode 22 kita menskalakan RoadRunner, pada episode kali ini kita membuka kotak terakhir: custom plugins & Velox. RoadRunner bukan sekadar kumpulan plugin bawaan — arsitekturnya memungkinkan kalian menulis plugin dalam Go, mengkompilasinya ke binary kustom, dan memanggilnya dari PHP via RPC. Ini kekuatan yang jarang ada di app server lain.
Mengapa episode ini penting? Karena beberapa kebutuhan tidak tercakup plugin bawaan: integrasi ke service internal, logika jaringan yang sangat cepat, atau sinkronisasi dengan sistem lain. Dengan Velox, kalian menambah kemampuan Go ke RoadRunner tanpa menulis ulang PHP.
Velox adalah tool dari tim RoadRunner untuk membangun binary kustom. Ia mengambil binary rr standar dan menggabungkannya dengan plugin tambahan yang kalian tulis (atau plugin komunitas). Hasilnya satu binary yang bisa dijalankan seperti biasa:
Persyaratan: Go toolchain terinstall (RoadRunner v2025.1.x memakai Go 1.26.x) — kalian hanya butuh Go untuk membangun; saat jalan, binary tetap single-file.
Plugin RoadRunner adalah package Go yang mengimplementasikan interface plugin. Contoh plugin yang menyediakan method RPC app.Ping:
package ping
import (
"fmt"
"time"
"github.com/roadrunner-server/api/v4/plugin/v4"
"github.com/roadrunner-server/endure/v2"
"github.com/roadrunner-server/endure/v2/container"
"github.com/roadrunner-server/endure/v2/dep"
)
const Name = "ping"
type Plugin struct {
startedAt time.Time
}
func (p *Plugin) Init() error {
p.startedAt = time.Now()
return nil
}
func (p *Plugin) Serve() chan error {
ch := make(chan error, 1)
return ch
}
func (p *Plugin) Stop() error {
return nil
}
func (p *Plugin) Name() string {
return Name
}
func (p *Plugin) Ping(payload []byte) ([]byte, error) {
return []byte(fmt.Sprintf("pong at %s", p.startedAt)), nil
}Init/Serve/Stop adalah siklus hidup plugin; method Ping menjadi RPC ping.Ping yang bisa dipanggil PHP. Kerangka lengkap plugin ada di repository roadrunner-server/endure — ini cukup untuk memahami polanya.
Note
Menulis plugin Go menuntut pemahaman Go dan model plugin RoadRunner (berbasis endure dependency-injection container). Untuk kebanyakan proyek, pakai plugin komunitas yang sudah jadi; tulis plugin sendiri hanya saat kebutuhan benar-benar tidak tercakup.
velox.yaml mendefinisikan binary kustom dan daftar plugin:
version: "2"
build:
output: rr-custom
command: "php app.php"
plugins:
- name: ping
module: "github.com/username/myplugins/ping"
version: "v0.1.0"
- name: custom-http
module: "github.com/roadrunner-server/http"
version: "v4.x"| Key | Fungsi |
|---|---|
version | Format config Velox ("2") |
build.output | Nama binary hasil build |
build.command | Command default yang dipakai server.command (opsional) |
plugins | Daftar plugin: nama, module Go, dan versi |
Install Velox dan jalankan build:
go install github.com/roadrunner-server/velox/v2@latest
velox -c velox.yaml
./rr-custom --versionHasilnya binary rr-custom berisi plugin bawaan plus plugin ping. Verifikasi plugin terdaftar:
./rr-custom list.rr.yamlPlugin kustom diaktifkan seperti plugin lainnya — dengan blok config (episode 3):
ping:
# blok config plugin, bila ada
server:
command: "php app.php"Jika plugin memerlukan config, tambahkan bloknya. Setelah itu, plugin aktif dan method RPC-nya tersedia.
Panggil method RPC plugin kustom memakai pola dari episode 7:
use Spiral\Goridge\RPC\RPC;
$rpc = RPC::create('tcp://127.0.0.1:6001');
$result = $rpc->call('ping.Ping', 'halo dari PHP');
echo $result; // "pong at ..."Ini membuka pola menarik: logika berkinerja kritis (misal parsing, enkripsi, agregasi) bisa ditulis dalam Go dan dipanggil PHP — dua bahasa, satu aplikasi.
| Situasi | Rekomendasi |
|---|---|
| Hanya butuh plugin bawaan | Binary resmi — tanpa Velox |
| Plugin komunitas tersedia | Binary resmi + konfigurasi |
| Kebutuhan Go spesifik | Velox + plugin kustom |
| Ingin binary lebih kecil | Velox dengan subset plugin |
Ingat trade-off: binary kustom harus dibangun ulang saat upgrade (episode 18) — proses build perlu masuk pipeline CI, bukan sekali jalan.
Pada episode 23 ini, kalian telah belajar menambah kemampuan Go ke RoadRunner.
Inti yang harus dibawa pulang:
Init/Serve/Stop; method-nya jadi RPC.velox.yaml mendaftarkan module dan versi plugin..rr.yaml.Di episode 24 selanjutnya, kita belajar ekosistem & tren modern 2026 — posisi RoadRunner v2025.1.x di antara Spiral, Laravel Octane, Symfony, FrankenPHP, Swoole, dan OpenSwoole, plus tren keamanan toolchain Go dan PHP 8.4/8.5. Sampai jumpa di episode 24!