PHP如何创建简单RPC服务
发表于:2025-11-18 作者:千家信息网编辑
千家信息网最后更新 2025年11月18日,小编给大家分享一下PHP如何创建简单RPC服务,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!RPC 定义RPC(Remot
千家信息网最后更新 2025年11月18日PHP如何创建简单RPC服务
小编给大家分享一下PHP如何创建简单RPC服务,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
RPC 定义
RPC(Remote Procedure Call)即远程过程调用,指被调用方法的具体实现不在程序运行本地,而是在别的某个地方。主要应用于不同的系统之间的远程通信和相互调用。
如 A 调用 B 提供的 remoteAdd 方法:
首先A与B之间建立一个TCP连接;
然后A把需要调用的方法名(这里是remoteAdd)以及方法参数(10, 20)序列化成字节流发送出去;
B接受A发送过来的字节流,然后反序列化得到目标方法名,方法参数,接着执行相应的方法调用(可能是localAdd)并把结果30返回;
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安全错误
数据库的锁怎样保障安全
软件开发入股协议有哪些
网络安全十原则
如何在数据库中存储图片路径
k2 vpn服务器
csc网络安全上岗证
疫情期间网络安全画
企业网络安全漏洞修补
小说数据库导入
软件开发环境netfram
比特币涉及的网络技术
wlan无线网络技术
软件开发工具图标
初中网络安全教育活动总结
非商业数据库
服务器密码忘记了怎么查看
列是数据库对象吗
网络安全对于学生的重要性
2003ftp服务器
服务器内存有几种
微信小程序配置服务器信息视频
软件开发公司价值观
软件开发企业的存货周转天数
达梦数据库cpu占用率高
大学有关网络安全活动总结
软件开发每人天多少钱
软件开发工程师证丢了怎么查
怎样建立数据库的界面
医院医保网络安全管理制度最新
大学软件开发本科课程
手机远端服务器连接不上网