이 글은 PHP와 Golang에 대한 관련 지식을 제공합니다. 주로 JSON RPC를 통해 Go와 통신하는 방법을 소개합니다. 도움이 필요한 친구들에게 도움이 되기를 바랍니다.
php는 JSON RPC
를 통해 golang과 통신합니다. 이 방법은 PHP 처리의 계산 집약적인 요구 사항을 해결합니다.
왜 서버간 접근이 안되는지 모르겠네요. 아시는 분은 메시지 남겨주세요.
go service
package main import ( "fmt" "log" "net" "net/rpc" "net/rpc/jsonrpc" ) type Calc struct{} type Args struct { A float64 `json:"a"` B float64 `json:"b"` Op string `json:"op"` } type Reply struct { Msg string `json:"msg"` Data float64 `json:"data"` } // 第一个是参数是获取客户端传来的数据,第二个参数是返回的数据 func (c *Calc) Compute(args Args, reply *Reply) error { var ( msg string = "ok" ) switch args.Op { case "+": reply.Data = args.A + args.B case "-": reply.Data = args.A - args.B case "*": reply.Data = args.A * args.B case "/": if args.B == 0 { msg = "in divide op, B can't be zero" } else { reply.Data = args.A / args.B } default: msg = fmt.Sprintf("unsupported op:%s", args.Op) } reply.Msg = msg if reply.Msg == "ok" { return nil } return fmt.Errorf(msg) } // 启动server端 func main() { err := rpc.Register(new(Calc)) if err != nil { panic(err) } listener, err := net.Listen("tcp", "127.0.0.1:8181") if err != nil { panic(err) } for { conn, err := listener.Accept() if err != nil { log.Println(err) continue } go jsonrpc.ServeConn(conn) } }
php client
public function Call($method, $params) { $this->conn = fsockopen('127.0.0.1', 8181, $errno, $errstr, 3); if (!$this->conn) { return false; } $err = fwrite($this->conn, json_encode(array( 'method' => $method, 'params' => array($params), 'id' => 12345, ))."\n"); if ($err === false) return false; stream_set_timeout($this->conn, 0, 3000); $line = fgets($this->conn); if ($line === false) { return NULL; } return json_decode($line,true); } public function Test() { //访问结构体 Calc 下 Compute 方法 $res = $this->Call("Calc.Compute",array('A'=>1,'B'=>2,'Op'=>'+')); return $res; }
Return results
{ "id": 12345, "result": { "msg": "ok", "data": 3 }, "error": null }
추천 학습: "PHP 비디오 튜토리얼"
위 내용은 PHP는 JSON RPC(코드 첨부)를 통해 통신을 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!