PHP如何创建简单RPC服务
发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,小编给大家分享一下PHP如何创建简单RPC服务,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!RPC 定义RPC(Remot
千家信息网最后更新 2025年02月01日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安全错误
数据库的锁怎样保障安全
服务器主板点不亮
网络安全法经历了3次审议
数据库及其建立过程课件
软件开发分组管理
软件开发风险承担问题
网络安全比赛大全
朗新科技智慧互联网
性能测试数据库索引
网络技术cad的答辩纪要
重新装了系统数据库不在了
系统网络安全模式
软件开发结构化程序设计风格
东北林业大学网络安全中心
网络安全手抄报里可以写什么
时序数据库哪种易用
长城软件开发待遇
地平线4服务器升级
奉贤区新能源软件开发诚信合作
网络安全事故应急预案范文
底纹下载软件开发
软件开发过程的维护过程
linux服务器如何安装管家婆
无法创建id服务器故障
政府部门软件开发
我的世界进入服务器无响应
软件开发和后期维护的工作
华为鲲鹏数据库排名第几
七日杀搜索服务器要多久
2021网络安全宣传资料
网络安全中心有用吗