php8环境原生实现rpc
liuian 2025-05-22 11:46 46 浏览
大数据分布式架构盛行时代的程序员面试,常常遇到分布式架构,RPC,本文的主角是RPC,英文名为Remote Procedure Call,翻译过来为“远程过程调用”。主流的平台中都支持各种远程调用技术,以满足分布式系统架构中不同的系统之间的远程通信和相互调用。远程调用的应用场景极其广泛,实现的方式也各式各样。作为WEB开发中主力军,PHP也是支持RPC的,那么如何原生实现呢?
PHP原生实现RPC,主要用到以下这6个函数:
stream_socket_server、stream_socket_client、stream_socket_accept、fread、fwrite、
fcloserpc由于服务端和客户端组成,下面让我们一起来实现服务端和客户端。
开发环境或者工具:PHP8.0+Visual Studio Code
先写服务端:
$rpc_server = stream_socket_server("tcp://127.0.0.1:6661",$err_no,$err_msg);
if(!$rpc_server)
{
echo "代码异常:".$err_no.",信息异常:".$err_msg;
exit();
}
while(true){
$result = [];//定义返回结果数组
try{
$buff = stream_socket_accept($rpc_server);
$data = fread($buff,2048);//读取客户端选数据
$json = json_decode($data,true);//转换客户端的json数据
$class = $json['class'];//客户端需要访问的类
$file = $class.".php";
require_once $file;//包含进来
if(!file_exists($file)){//如果文件不存在
throw new Exception('文件不存在','404');
}
$method = $json['method'];//客户端需要访问的方法
$obj = new $class();//实例化对象
$rpc_server_data = $obj->$method($json['can_shu']);//调用方法
$result['code'] = 1;//成功返回1
$result['data'] = $rpc_server_data;//返回数据
$result['msg'] = "请求成功";
$result_data = json_encode($result);//转换为json数据
fwrite($buff,$result_data);
fclose($rpc_server);//关闭资源
}catch(Excepiton $e){
$result['code'] = $e->getCode();//失败返回
$result['data'] = $rpc_server_data;//返回空数据
$result['msg'] = $e->getMessage();//失败返回
$result_data = json_encode($result);//转换为json数据
fwrite($buff,$result);
fclose($rpc_server);//关闭资源
}编写服务端辅助文件login.php:
class login
{
public function get_account($number=''){
return "编程自学".$number;
}
}接着写客户端:
$rpc_client = stream_socket_client("tcp://127.0.0.1:6661",$err_no,$err_msg);
if(!$rpc_client)
{
echo "代码异常:".$err_no.",信息异常:".$err_msg;
exit();
}
$c_data['class'] = "login";
$c_data['method'] = "get_account";
$c_data['can_shu'] = "8";
$rpc_data = json_encode($c_data);
fwrite($rpc_client,$rpc_data);//发送给服务端
$rpc_server_data = fread($rpc_client,2048);//读取服务端数据
$sever_json = json_decode($rpc_server_data);//解码json数据
fclose($rpc_client);//关闭资源
var_dump($sever_json);//打印启动服务端:php rpc_server.php
然后启动客户端:php rpc_client.php,可以看到下面效果:
改造成从浏览器中打开:
//rpc:
public function testRpc()
{
$rpc_client = stream_socket_client("tcp://127.0.0.1:6661",$err_no,$err_msg);
if(!$rpc_client)
{
echo "代码异常:".$err_no.",信息异常:".$err_msg;
exit();
}
$c_data['class'] = $_GET['c'];
$c_data['method'] = $_GET['m'];
$c_data['can_shu'] = $_GET['n'];
$rpc_data = json_encode($c_data);
fwrite($rpc_client,$rpc_data);//发送给服务端
$rpc_server_data = fread($rpc_client,2048);//读取服务端数据
$sever_json = json_decode($rpc_server_data,true);//解码json数据
fclose($rpc_client);//关闭资源
dd($sever_json);//打印
}启动服务,在浏览器中打开http://127.0.0.1:8000/test-rpc?c=login&m=get_account&n=8
可以看到下面效果:
这一节就介绍到这里了。
相关推荐
- 系统光盘镜像下载(系统光盘镜像文件转换到u盘)
-
要在虚拟机中使用映像文件,需要先将映像文件下载到本地计算机上,然后将其上传到虚拟机中。以下是下载映像文件的步骤:1.打开虚拟机管理软件,例如VMwareWorkstation或Virtual...
- ghost系统盘制作(制作ghost启动盘)
-
首先,需要准备东西如下:光驱起码要支持DVD刻录吧,您要是Combo刻CD还真不好意思和别人打招呼。。。DVD白盘若干,一张随便什么样的可引导系统盘(里面有ghost的那种),nero软件,Ultra...
- cad2008序列号和激活码(cad2008序列号密钥)
-
2008cad注册码是666-98989898。双击“AutoCAD2008Chs_运行获取激活码.exe”,将注册界面上的申请号粘贴到“AutoCAD2008Chs_运行获取激活码.exe”申请号一...
-
- 电脑无线网连不上怎么办(电脑无线网连接不上怎么回事)
-
1、打开“控制面板”,点击“网络和Internet”。2、点击“网络和共享中心”。3、点击“更改适配器设置”。4、鼠标右键单击需要连接的网络,在弹出的对话框中,点击“属性”。5、选中“Internet协议版本4(TCP/IPv4)”,...
-
2025-11-28 23:55 liuian
- u盘如何恢复删除的文件(如何恢复u盘中被删除的文件)
-
如果您在使用WPS时误删了U盘文件,可以使用以下几种方法来恢复文件:1.检查回收站:首先检查一下您的回收站中是否有被误删的文件,如果有,可以将文件恢复回来。2.使用WPS数据恢...
- 推特官网入口(推特官网入口网页登录网址)
-
首先在浏览器中打开推特的官网,然后点击页面上的“注册”创建账号。Twitter可以让用户更新不超过140个字符的消息(除中文、日文和韩语外已提高上限至280个字符),这些消息也被称作“推文(Tweet...
- windows7如何清理c盘(win7怎么清理c盘)
-
1.打开桌面计算机,右键点击“C盘”,并选取“属性”。2.待新窗口弹出后,依次点击“工具”、“立即进行碎片整理”。3.最后,选取C盘,在按下“磁盘碎片整理”按钮,系统就会对C盘进行分析,并进行整理。4...
- win10自带分区工具(win10官方分区工具)
-
Win10自带的分区工具是磁盘管理器,可以用来创建、删除、格式化和调整磁盘分区。下面是使用磁盘管理器分区的步骤:1.打开磁盘管理器。您可以在Windows10搜索栏中输入“磁盘管理器”来快速打开。...
- appstore正版下载软件(apple store下载正版)
-
不会,他是正版的,因为只有ios系统可以用,但他里面的好游戏都是要收费的,所以打架都要越狱,去其它地方下载,不去商店的在安卓上,GooglePlayStore是类似于苹果的AppStore一...
- 手机锁屏密码键盘没了(手机输入密码的键盘没了怎么办)
-
如果手机锁屏密码的键盘找不到,首先要确认是否是由于软件问题导致的。可以尝试重启手机或者清理手机缓存来解决。如果问题仍然存在,可以尝试更换输入法或者恢复手机出厂设置来解决。如果以上方法都没有效果,建议联...
- 移动硬盘跟固态硬盘的区别(移动硬盘跟固态硬盘的区别是什么)
-
一:移动硬盘移动硬盘是指以传统机械磁盘作为存储介质,用于计算机之间交换大容量数据,讲究移动便携性的存储产品。优点:具有容量大、价格便宜的特点,方便存储大量文件数据。(推荐学习:web前端视频教程)缺...
- windows怎么截图快捷键(windows截图快捷键没反应)
-
1、按Prtsc键截图这样获取的是整个电脑屏幕的内容,按Prtsc键后,可以直接打开画图工具,接粘贴使用。也可以粘贴在QQ聊天框或者Word文档中,之后再选择保存即可。2、按Ctrl+Prtsc键截图...
- 显示器分辨率有哪几种(显示器屏幕分辨率都有哪些)
-
目前使用较多的显示器分辨率有640*480,800*600,1024*768,1280*1024四种。刷新率,这主要是指显示器显示画面每秒刷新的次数,现在的电脑显示屏刷新率一般为75Hz,如果刷新率在...
- windows7激活工具 知乎(win7激活工具怎么使用教程)
-
Win7激活工具有很多,比如kms激活工具、小马激活工具、Windowsloader等。下面以这三款激活工具为例,做一个简单的比较。1、kms激活工具,相对比较稳定,通用性强,对各种gho、iso镜...
- 一周热门
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)
- mysql刷新权限 (34)
