Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PHP扩展设计 #65

Open
zd-double opened this issue Jan 19, 2016 · 0 comments
Open

PHP扩展设计 #65

zd-double opened this issue Jan 19, 2016 · 0 comments

Comments

@zd-double
Copy link
Collaborator

功能

以php扩展的方式提供给用户,用户使用扩展库在php程序中向server发起RPC调用

接口设计

用户接口

  • PHP-Protobuf库选用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保持一致,以EchoServiceStub为例,用户的proto文件中service定义如下:
    service EchoServiceStub
    {
        rpc Echo(EchoRequest) returns(EchoResponse);
    }

生成Service/Method函数接口如下:

    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_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会在扩展目录下给出。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant