The Wayback Machine - https://web.archive.org/web/20201012155556/https://github.com/spiral/goridge
Skip to content
master
Go to file
Code

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
May 19, 2020
Aug 13, 2017
May 19, 2020
May 19, 2020
May 19, 2020
Jan 13, 2020
May 19, 2020
May 19, 2020
May 19, 2020
May 19, 2020

README.md

High-performance PHP-to-Golang IPC bridge

Latest Stable Version GoDoc CI Scrutinizer Code Quality Go Report Card Codecov

PHPClasses Innovation Award

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

Features

  • 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)

Installation

$ go get "github.com/spiral/goridge"
$ composer require spiral/goridge

Example

<?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:

License

The MIT License (MIT). Please see LICENSE for more information.

You can’t perform that action at this time.