在 PHP 中调用 Go RPC 套接字方法
Call Go RPC socket methods in PHP
我开始寻找 RPC 框架并找到了 gRPC,但我的问题是它使用了 Protocol-Buffer,我担心如果我想在我当前的单体 PHP 应用程序中使用它一团糟。所以,我开始实现一个 Go 基本 RPC 服务,但目前我不知道在 PHP 中使用什么以及如何使用它。
所以基本上我有一个数据库管理器包,其中有这些结构和方法:
type DatabaseManager struct {
Database *gorm.DB
Log logging.Logger
}
func (db *DatabaseManager) Last(args *string, reply *string) error {
db.Log[logging.INFO].Printf("%v", *args)
reply = args
db.Log[logging.INFO].Printf("%v", *reply)
return nil
}
我正在使用启动服务器进行监听的命令:
func registerDatabaseManager(server *rpc.Server, dbManager *databasemanager.DatabaseManager) {
server.RegisterName("DatabaseManager", dbManager)
}
func RunRPC(path string) error {
db, _, log := dependencyInjection(path)
dbManager := &databasemanager.DatabaseManager{
Database: db,
Log: log,
}
server := rpc.NewServer()
registerDatabaseManager(server, dbManager)
listen, err := net.Listen("tcp", ":50051")
if err != nil {
log[logging.ERROR].Print(err)
}
log[logging.INFO].Print("Server started - listening on :50051")
server.Accept(listen)
return nil
}
所以基本上它使用的是一种非常基本的方法。请求和响应格式将是 JSON 因为大多数时候它会处理大量数据。
Golang 中的客户端如下所示:
type DBManager struct {
client *rpc.Client
}
func (t *DBManager) Last(args *string) string {
*args = "awesome test"
var reply string
err := t.client.Call("DatabaseManager.Last", args, &reply)
if err != nil {
log.Fatal("arith error:", err)
}
return reply
}
func main() {
conn, err := net.Dial("tcp", "localhost:50051")
if err != nil {log.Fatal("Connectiong:", err)}
dbManager := &DBManager{client: rpc.NewClient(conn)}
asd := "asdasqwesaf"
fmt.Println(dbManager.Last(&asd))
}
它运行良好,我可以使用它,但曾提到我有一个旧的单体PHP,我也想在那里使用这些方法。
我在网上找到了this,就是实现了我想要的一样,但是这个问题我尝试根据需要重写它,但是它不起作用。基本上我只是将 callRPC 参数更改如下:
$result = callRPC(
"tcp://127.0.0.1:50051",
[
'{"method":"DatabaseManager.Last","params":["asd"],"id":0}',
],
1,
8
);
我不知道,我遵循的是好的方法吗?或不?也许有人可以告诉我更好的解决方案。
我开始寻找 RPC 框架并找到了 gRPC,但我的问题是它使用了 Protocol-Buffer,我担心如果我想在我当前的单体 PHP 应用程序中使用它一团糟。所以,我开始实现一个 Go 基本 RPC 服务,但目前我不知道在 PHP 中使用什么以及如何使用它。
所以基本上我有一个数据库管理器包,其中有这些结构和方法:
type DatabaseManager struct {
Database *gorm.DB
Log logging.Logger
}
func (db *DatabaseManager) Last(args *string, reply *string) error {
db.Log[logging.INFO].Printf("%v", *args)
reply = args
db.Log[logging.INFO].Printf("%v", *reply)
return nil
}
我正在使用启动服务器进行监听的命令:
func registerDatabaseManager(server *rpc.Server, dbManager *databasemanager.DatabaseManager) {
server.RegisterName("DatabaseManager", dbManager)
}
func RunRPC(path string) error {
db, _, log := dependencyInjection(path)
dbManager := &databasemanager.DatabaseManager{
Database: db,
Log: log,
}
server := rpc.NewServer()
registerDatabaseManager(server, dbManager)
listen, err := net.Listen("tcp", ":50051")
if err != nil {
log[logging.ERROR].Print(err)
}
log[logging.INFO].Print("Server started - listening on :50051")
server.Accept(listen)
return nil
}
所以基本上它使用的是一种非常基本的方法。请求和响应格式将是 JSON 因为大多数时候它会处理大量数据。
Golang 中的客户端如下所示:
type DBManager struct {
client *rpc.Client
}
func (t *DBManager) Last(args *string) string {
*args = "awesome test"
var reply string
err := t.client.Call("DatabaseManager.Last", args, &reply)
if err != nil {
log.Fatal("arith error:", err)
}
return reply
}
func main() {
conn, err := net.Dial("tcp", "localhost:50051")
if err != nil {log.Fatal("Connectiong:", err)}
dbManager := &DBManager{client: rpc.NewClient(conn)}
asd := "asdasqwesaf"
fmt.Println(dbManager.Last(&asd))
}
它运行良好,我可以使用它,但曾提到我有一个旧的单体PHP,我也想在那里使用这些方法。
我在网上找到了this,就是实现了我想要的一样,但是这个问题我尝试根据需要重写它,但是它不起作用。基本上我只是将 callRPC 参数更改如下:
$result = callRPC(
"tcp://127.0.0.1:50051",
[
'{"method":"DatabaseManager.Last","params":["asd"],"id":0}',
],
1,
8
);
我不知道,我遵循的是好的方法吗?或不?也许有人可以告诉我更好的解决方案。