千家信息网

PHP如何创建简单RPC服务

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,小编给大家分享一下PHP如何创建简单RPC服务,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!RPC 定义RPC(Remot
千家信息网最后更新 2026年11月03日PHP如何创建简单RPC服务

小编给大家分享一下PHP如何创建简单RPC服务,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

RPC 定义

RPC(Remote Procedure Call)即远程过程调用,指被调用方法的具体实现不在程序运行本地,而是在别的某个地方。主要应用于不同的系统之间的远程通信和相互调用。

如 A 调用 B 提供的 remoteAdd 方法:

  1. 首先A与B之间建立一个TCP连接;

  2. 然后A把需要调用的方法名(这里是remoteAdd)以及方法参数(10, 20)序列化成字节流发送出去;

  3. B接受A发送过来的字节流,然后反序列化得到目标方法名,方法参数,接着执行相应的方法调用(可能是localAdd)并把结果30返回;

  4. A接受远程调用结果

有些远程调用选择比较底层的 socket 协议,有些远程调用选择比较上层的 HTTP 协议。

远程调用的好处:

  • 解耦:当方法提供者需要对方法内实现修改时,调用者完全感知不到,不用做任何变更;这种方式在跨部门,跨公司合作的时候经常用到,并且方法的提供者我们通常称为:服务的暴露方

这里使用 PHP Socket 来创建一个服务端和客户端,目录结构如下:

服务端

server = socket_create(AF_INET,SOCK_STREAM,SOL_TCP)) < 0) {            exit("socket_create() 失败的原因是:".socket_strerror($this->server)."\n");        }        if(($ret = socket_bind($this->server,$host,$port)) < 0) {            exit("socket_bind() 失败的原因是:".socket_strerror($ret)."\n");        }        if(($ret = socket_listen($this->server,3)) < 0) {            exit("socket_listen() 失败的原因是:".socket_strerror($ret)."\n");        }        // 判断 RPC 服务目录是否存在        $realPath = realpath(__DIR__ . $path);        if ($realPath === false || !file_exists($realPath)) {            exit("{$path} error \n");        }        do {            $client = socket_accept($this->server);            if($client) {                // 一次性读取                $buf = socket_read($client, 8024);                echo $buf;                //解析客户端发送过来的协议                $classRet = preg_match('/Rpc-Class:\s(.*);\r\n/i', $buf, $class);                $methodRet = preg_match('/Rpc-Method:\s(.*);\r\n/i', $buf, $method);                $paramsRet = preg_match('/Rpc-Params:\s(.*);\r\n/i', $buf, $params);                if($classRet && $methodRet) {                    $class = ucfirst($class[1]);                    $method = $method[1];                    $params = json_decode($params[1], true);                    $file = $realPath . '/' . $class . '.php';  // 类文件需要和类名一致                    $data = ''; // 执行结果                    // 判断类文件是否存在                    if(file_exists($file)) {                        // 引入类文件                        require_once $file;                        // 实例化类                        $rfc_obj = new ReflectionClass($class);                        // 判断该类指定方法是否存在                        if($rfc_obj->hasMethod($method)) {                            // 执行类方法                            $rfc_method = $rfc_obj->getMethod($method);                            $data = $rfc_method->invokeArgs($rfc_obj->newInstance(), [$params]);                        } else {                            socket_write($client, 'method error');                        }                        //把运行后的结果返回给客户端                        socket_write($client, $data);                    }                } else {                    socket_write($client, 'class or method error');                }                // 关闭客户端                socket_close($client);            }        }while(true);    }    public function __destruct()    {        socket_close($this->server);    }}new RpcServer('127.0.0.1',8080,'./service');

客户端

url_info = parse_url($url);    }    public function __call($name, $arguments)    {        // 创建一个客户端        $this->client = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);        if(!$this->client) {            exit('socket_create() 失败');        }        socket_connect($this->client, $this->url_info['host'], $this->url_info['port']);        // 传递调用的类名        $class = basename($this->url_info['path']);        // 传递调用的参数        $args = '';        if(isset($arguments[0])) {            $args = json_encode($arguments[0]);        }        // 向服务端发送我们自定义的协议数据        $proto = "Rpc-Class: {$class};".PHP_EOL            ."Rpc-Method: {$name};".PHP_EOL            ."Rpc-Params: {$args};".PHP_EOL;        socket_write($this->client, $proto);        // 读取服务端传来的数据        $buf = socket_read($this->client, 8024);        socket_close($this->client);        return $buf;    }}$rpcClient = new RpcClient('http://127.0.0.1:8080/news');echo $rpcClient->display(['title'=>'txl']);echo $rpcClient->display(['title'=>'hello world']);

服务类 News

"News display(), title is {$data['title']}"]);    }}

运行测试:

Client

Server

以上是"PHP如何创建简单RPC服务"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

方法 服务 客户 客户端 结果 参数 文件 篇文章 运行 之间 内容 序列 提供者 数据 类名 选择 不同 一致 一次性 上层 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 手冲咖啡和咖啡机区别 互联网科技有限公司 河南云网互联网络科技有限公司 深圳恒合互联网络科技有限公司 互联网品科技 科技互联网技术 关于新基建和互联网科技 互联网科技论文 四个字互联网科技公司取名 滨湖区互联网智能科技产品供应 哈尔滨秒房互联网科技有限公司 天津腾达互联网科技有限公司 乌鲁木齐新华智原互联网科技学校 高科技互联网发展前景如何 互联网科技如何创业 南博望互联网科技有限公司 互联网科技平台产品运营 杭州融税互联网科技有限公司 科技互联网企业在行动 六子台科技互联网展会 上海挚品互联网科技有限公司 中智农互联网科技 嘟嘟瓜互联网科技 银优互联网科技有限公司 猫创互联网科技 栖莱科技互联网股份有限公司 速维有品互联网信息科技(苏州)有限公司 广西互联网科技孵化中心 乌苏新华互联网科技做什么的 第三届互联网大会安防黑科技
0