PHP扩展设计
- Dominant language
- C++
- Stars
- 2.1k
- Forks
- 649
- PR merge metrics
- No merged PRs in 30d
Description
# 功能
以php扩展的方式提供给用户,用户使用扩展库在php程序中向server发起RPC调用
# 接口设计
## 用户接口
- PHP-Protobuf库选用[allegro/php-protobuf](https://github.com/allegro/php-protobuf),并修改其pb接口生成工具,增加与RPC相关的Service和Method接口,用户定义proto后通过工具protoc-php.php生成php-protobuf接口文件,该接口中调用sofa-pbrpc php扩展的功能函数,实现RPC调用。
- sofa-pbrpc php扩展为用户提供一个接口类PHPRpcServiceStub,工具生成的pb接口中rpc服务继承于该类,通过该类进行RPC调用,并获取调用的错误码以及错误提示。生成pb接口的Message部分与[allegro/php-protobuf](https://github.com/allegro/php-protobuf)保持一致,以EchoServiceStub为例,用户的proto文件中service定义如下:
``` php
service EchoServiceStub
{
rpc Echo(EchoRequest) returns(EchoResponse);
}
```
生成Service/Method函数接口如下:
``` php
class EchoServiceStub extends PHPRpcServiceStub
{
// 用户通过EchoServiceStub 类创建rpc服务实例
function __construct($address);
// 在stub中注册method
private function RegisterEcho();
// 设置rpc调用超时
public function SetTimeout($timeout);
// 发起RPC调用
public function Echo($request, $response, $closure);
// 获取错误码
public function Failed();
// 获取错误提示
public function ErrorText();
}
```
## 扩展接口
- 扩展的工作流程分为三个部分
1. 初始化RpcServiceStub:创建RpcChannel和RpcController等组件
2. 用户Method注册:解析输入输出Descriptor,在method_board添加表项
3. 用户传递的request pb结构转换成google 的pb结构
4. 调用CallMethod发起RPC调用
5. 将google pb结构的response转化成用户pb结构
扩展暴露给PHP的接口如下:
``` php
PHP_METHOD(PHPRpcServiceStub, InitService);
PHP_METHOD(PHPRpcServiceStub, SetTimeout);
PHP_METHOD(PHPRpcServiceStub, Failed);
PHP_METHOD(PHPRpcServiceStub, ErrorText);
PHP_METHOD(PHPRpcServiceStub, RegisterMethod);
PHP_METHOD(PHPRpcServiceStub, InitMethods);
PHP_METHOD(PHPRpcServiceStub, CallMethod);
```
- 用户接口中__construct调用InitService创建RPC组件,对service初始化
- RegisterEcho调用RegisterMethod和InitMethods,注册用户函数并初始化
- Echo调用CallMethod完成RPC调用
- SetTimeout调用SetTimeout设置超时
- 用户接口中Failed和ErrorText分别调用扩展中Failed和ErrorText获取错误状态的错误信息
## 用户使用方法
- 编译生成sofa_pbrpc.so扩展库,通过修改php.ini装载扩展
- 使用protoc-php.php生成proto_pb.php文件,在代码中require该pb接口,sample会在扩展目录下给出。
Contributor guide
No contributing guide indexed for this repository
Research direction
The issue provides no repository file or test entry point. Start by reviewing the proposed PHPRpcServiceStub APIs, the protoc-php.php generation flow, and the extension sample; done means the PHP extension, generated Service/Method interfaces, protobuf conversions, RPC calls, timeout/error reporting, and documented loading path work as described.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- cpp, php
- Domain
- backend, backend-api-design
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 30/100