百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

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、
fclose

rpc由于服务端和客户端组成,下面让我们一起来实现服务端和客户端。

开发环境或者工具: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镜...