• 技术文章 >后端开发 >php教程

    php实现通过JSON RPC与go通讯(附代码)

    藏色散人藏色散人2023-01-13 10:16:40转载34

    本篇文章给大家带来了关于php与golang的相关知识,其中主要介绍了php是怎么通过JSON RPC和go进行通讯的,下面一起来看一下,希望对需要的朋友有所帮助。

    php 通过 JSON RPC 与 golang 通讯

    此方法为解决php处理计算密集型需求。

    不知道为啥,不能跨服务器访问,有知道的请留言。

    go 服务

    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 客户端

      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;
        }

    返回结果

    {
        "id": 12345,
        "result": {
            "msg": "ok",
            "data": 3
        },
        "error": null
    }

    推荐学习:《PHP视频教程

    以上就是php实现通过JSON RPC与go通讯(附代码)的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:csdn,如有侵犯,请联系admin@php.cn删除
    专题推荐:php Golang
    上一篇:浅析怎么使用PHP做异步爬取数据 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • php结合html5的websocket通讯的使用方法• 关于php main 与 iframe 相互通讯类(同域/跨域)的介绍• PHP进程模型、进程通讯方式、进程线程的区别分别有哪些?• php 怎么实现即时通讯实例
    1/1

    PHP中文网