Goridge is high performance PHP-to-Golang codec library which works over native PHP sockets and Golang net/rpc package.
The library allows you to call Go service methods from PHP with minimal footprint, structures and []byte
support.
See https://github.com/spiral/roadrunner - High-performance PHP application server, load-balancer and process manager written in Golang
- no external dependencies or services, drop-in (64bit PHP version required)
- low message footprint (17 bytes over any binary payload), binary error detection
- sockets over TCP or Unix (ext-sockets is required), standard pipes
- very fast (300k calls per second on Ryzen 1700X over 20 threads)
- native
net/rpc
integration, ability to connect to existed application(s) - standalone protocol usage
- structured data transfer using json
[]byte
transfer, including big payloads- service, message and transport level error handling
- hackable
- works on Windows
- unix sockets powered (also on Windows)
$ go get "github.com/spiral/goridge"
$ composer require spiral/goridge
<?php
use Spiral\Goridge;
require "vendor/autoload.php";
$rpc = new Goridge\RPC(new Goridge\SocketRelay("127.0.0.1", 6001));
//or, using factory:
$tcpRPC = Goridge\Relay::create('tcp://127.0.0.1:6001');
$unixRPC = Goridge\Relay::create('unix:///tmp/rpc.sock');
$streamRPC = Goridge\Relay::create('pipes://stdin:stdout');
echo $rpc->call("App.Hi", "Antony");
Factory applies the next format:
<protocol>://<arg1>:<arg2>
package main
import (
"fmt"
"github.com/spiral/goridge/v2"
"net"
"net/rpc"
)
type App struct{}
func (s *App) Hi(name string, r *string) error {
*r = fmt.Sprintf("Hello, %s!", name)
return nil
}
func main() {
ln, err := net.Listen("tcp", ":6001")
if err != nil {
panic(err)
}
rpc.Register(new(App))
for {
conn, err := ln.Accept()
if err != nil {
continue
}
go rpc.ServeCodec(goridge.NewCodec(conn))
}
}
Check this libraries in order to find suitable socket manager:
The MIT License (MIT). Please see LICENSE
for more information.