详解如何利用PHP实现RPC_第1页
详解如何利用PHP实现RPC_第2页
详解如何利用PHP实现RPC_第3页
详解如何利用PHP实现RPC_第4页
详解如何利用PHP实现RPC_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第详解如何利用PHP实现RPC目录1.什么是RPC2.从通信协议的层面3.从不同的开发语言和平台层面4.从调用过程来看5.常见的几种通信方式6.php实现简单的rpc1.目录结构2.rpc服务端3.rpc客户端4.提供服务的文件5.效果7.RPC的注意事项

1.什么是RPC

RPC全称为RemoteProcedureCall,翻译过来为远程过程调用。主流的平台中都支持各种远程调用技术,以满足分布式系统架构中不同的系统之间的远程通信和相互调用。远程调用的应用场景极其广泛,实现的方式也各式各样。

2.从通信协议的层面

基于HTTP协议的(例如基于文本的SOAP(XML)、Rest(JSON),基于二进制Hessian(Binary))

基于TCP协议的(通常会借助Mina、Netty等高性能网络框架)

3.从不同的开发语言和平台层面

单种语言或平台特定支持的通信技术(例如Java平台的RMI、.NET平台Remoting)

支持跨平台通信的技术(例如HTTPRest、Thrift等)

4.从调用过程来看

同步通信调用(同步RPC)

异步通信调用(MQ、异步RPC)

5.常见的几种通信方式

远程数据共享(例如:共享远程文件,共享数据库等实现不同系统通信)

消息队列

RPC(远程过程调用)

6.php实现简单的rpc

1.目录结构

2.rpc服务端

php

*User:yuzhao

*CreateTime:2025/11/15下午11:46

*Description:Rpc服务端

classRpcServer{

*User:yuzhao

*CreateTime:2025/11/15下午11:51

*@vararray

*Description:此类的基本配置

private$params=[

'host'='',//ip地址,列出来的目的是为了友好看出来此变量中存储的信息

'port'='',//端口

'path'=''//服务目录

*User:yuzhao

*CreateTime:2025/11/16上午12:14

*@vararray

*Description:本类常用配置

private$config=[

'real_path'='',

'max_size'=2048//最大接收数据大小

*User:yuzhao

*CreateTime:2025/11/15下午11:50

*@varnul

*Description:

private$server=null;

*Rpcconstructor.

publicfunction__construct($params)

$this-check();

$this-init($params);

*User:yuzhao

*CreateTime:2025/11/16上午12:0

*Description:必要验证

privatefunctioncheck(){

$this-serverPath();

*User:yuzhao

*CreateTime:2025/11/15下午11:48

*Description:初始化必要参数

privatefunctioninit($params){

//将传递过来的参数初始化

$this-params=$params;

//创建tcpsocket服务

$this-createServer();

*User:yuzhao

*CreateTime:2025/11/16上午12:0

*Description:创建tcpsocket服务

privatefunctioncreateServer(){

$this-server=stream_socket_server("tcp://{$this-params['host']}:{$this-params['port']}",$errno,$errstr);

if(!$this-server)exit([

$errno,$errstr

*User:yuzhao

*CreateTime:2025/11/15下午11:57

*Description:rpc服务目录

publicfunctionserverPath(){

$path=$this-params['path'];

$realPath=realpath(__DIR__.$path);

if($realPath===false||!file_exists($realPath)){

exit("{$path}error!");

$this-config['real_path']=$realPath;

*User:yuzhao

*CreateTime:2025/11/15下午11:51

*Description:返回当前对象

publicstaticfunctioninstance($params){

returnnewRpcServer($params);

*User:yuzhao

*CreateTime:2025/11/16上午12:06

*Description:运行

publicfunctionrun(){

while(true){

$client=stream_socket_accept($this-server);

if($client){

echo"有新连接\n";

$buf=fread($client,$this-config['max_size']);

print_r('接收到的原始数据:'.$buf."\n");

//自定义协议目的是拿到类方法和参数(可改成自己定义的)

$this-parseProtocol($buf,$class,$method,$params);

//执行方法

$this-execMethod($client,$class,$method,$params);

//关闭客户端

fclose($client);

echo"关闭了连接\n";

*User:yuzhao

*CreateTime:2025/11/16上午12:19

*@param$class

*@param$method

*@param$params

*Description:执行方法

privatefunctionexecMethod($client,$class,$method,$params){

if($class$method){

//首字母转为大写

$class=ucfirst($class);

$file=$this-params['path'].'/'.$class.'.php';

//判断文件是否存在,如果有,则引入文件

if(file_exists($file)){

require_once$file;

//实例化类,并调用客户端指定的方法

$obj=new$class();

//如果有参数,则传入指定参数

if(!$params){

$data=$obj-$method();

}else{

$data=$obj-$method($params);

//打包数据

$this-packProtocol($data);

//把运行后的结果返回给客户端

fwrite($client,$data);

}else{

fwrite($client,'classormethoderror');

*User:yuzhao

*CreateTime:2025/11/16上午12:10

*Description:解析协议

privatefunctionparseProtocol($buf,$class,$method,$params){

$buf=json_decode($buf,true);

$class=$buf['class'];

$method=$buf['method'];

$params=$buf['params'];

*User:yuzhao

*CreateTime:2025/11/16上午12:30

*@param$data

*Description:打包协议

privatefunctionpackProtocol($data){

$data=json_encode($data,JSON_UNESCAPED_UNICODE);

RpcServer::instance([

'host'='',

'port'=8888,

'path'='./api'

])-run();

3.rpc客户端

php

*User:yuzhao

*CreateTime:2025/11/16上午12:2

*Description:Rpc客户端

classRpcClient{

*User:yuzhao

*CreateTime:2025/11/16上午12:21

*@vararray

*Description:调用的地址

private$urlInfo=array();

*RpcClientconstructor.

publicfunction__construct($url)

$this-urlInfo=parse_url($url);

*User:yuzhao

*CreateTime:2025/11/16上午12:2

*Description:返回当前对象

publicstaticfunctioninstance($url){

returnnewRpcClient($url);

publicfunction__call($name,$arguments)

//TODO:Implement__call()method.

//创建一个客户端

$client=stream_socket_client("tcp://{$this-urlInfo['host']}:{$this-urlInfo['port']}",$errno,$errstr);

if(!$client){

exit("{$errno}:{$errstr}\n");

$data=[

'class'=basename($this-urlInfo['path']),

'method'=$name,

'params'=$arguments

//向服务端发送我们自定义的协议数据

fwrite($client,json_encode($data));

//读取服务端传来的数据

$data=fread($client,2048);

//关闭客户端

fclose($client);

return$data;

$cli=newRpcClient(':8888/test');

echo$cli-tuzisir1()."\n";

echo$cli-tuzisir2(array('name'='tuzisir','age'=23));

4.提供服务的文件

php

*User:yuzhao

*CreateTime:2025/11/16上午12:28

*

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论