zoukankan      html  css  js  c++  java
  • protoc-gen-php --php_out: protoc-gen-php: Plugin output is unparseable.

    背景

    业务需要用protobuffer 进行通讯。

    client: php

    server: c++

    在github 上找到 Protobuf-PHP (https://github.com/drslump/Protobuf-PHP) 的评分不错,故采用它作为协议生成库来生成PHP侧的交互协议。

    问题

    生成php proto

    protoc --plugin=/usr/local/php/bin/protoc-gen-php --php_out=. -I. tutorial.proto

    报错:--php_out: protoc-gen-php: Plugin output is unparseable.

    proto 文件 tutorial.proto 如下:

    package tutorial;
    
    message Person {
       required string name = 1;
       required int32 id = 2;
       optional string email = 3;
       
        enum PhoneType {
            MOBILE = 0;
            HOME = 1;
            WORK = 2;
       }
    
       message PhoneNumber {
            required string number = 1;
            optional PhoneType type = 2 [default = HOME];   
       }
    
       repeated PhoneNumber phone = 4; 
    }  
    
    message AddressBook {
       repeated Person person = 1; 
    }

    定位与解决

    PHP日志跟踪发现:

    [13-Apr-2015 15:33:55 GMT] PHP Warning:  Missing argument 2 for DrSlumpProtobufCodecBinary::getWireType(), called in /usr/local/services/php-5.4.39/lib/php/DrSlump/Protobuf/Codec/Binary.php on line 249 and defined in /usr/local/services/php-5.4.39/lib/php/DrSlump/Protobuf/Codec/Binary.php on line 333
    [13-Apr-2015 15:33:55 GMT] PHP Stack trace:
    [13-Apr-2015 15:33:55 GMT] PHP   1. {main}() /usr/local/services/php-5.4.39/bin/protoc-gen-php:0
    [13-Apr-2015 15:33:55 GMT] PHP   2. DrSlumpProtobufCompilerCli::run() /usr/local/services/php-5.4.39/bin/protoc-gen-php:43
    [13-Apr-2015 15:33:55 GMT] PHP   3. DrSlumpProtobufCompiler->compile() /usr/local/services/php-5.4.39/lib/php/DrSlump/Protobuf/Compiler/Cli.php:55
    [13-Apr-2015 15:33:55 GMT] PHP   4. DrSlumpProtobufMessage->__construct() /usr/local/services/php-5.4.39/lib/php/DrSlump/Protobuf/Compiler.php:104
    [13-Apr-2015 15:33:55 GMT] PHP   5. DrSlumpProtobufMessage->parse() /usr/local/services/php-5.4.39/lib/php/DrSlump/Protobuf/Message.php:56
    [13-Apr-2015 15:33:55 GMT] PHP   6. DrSlumpProtobufCodecBinary->decode() /usr/local/services/php-5.4.39/lib/php/DrSlump/Protobuf/Message.php:107
    [13-Apr-2015 15:33:55 GMT] PHP   7. DrSlumpProtobufCodecBinary->decodeMessage() /usr/local/services/php-5.4.39/lib/php/DrSlump/Protobuf/Codec/Binary.php:65
    [13-Apr-2015 15:33:55 GMT] PHP   8. DrSlumpProtobufCodecBinary->decodeMessage() /usr/local/services/php-5.4.39/lib/php/DrSlump/Protobuf/Codec/Binary.php:266
    [13-Apr-2015 15:33:55 GMT] PHP   9. DrSlumpProtobufCodecBinary->decodeMessage() /usr/local/services/php-5.4.39/lib/php/DrSlump/Protobuf/Codec/Binary.php:266
    [13-Apr-2015 15:33:55 GMT] PHP  10. DrSlumpProtobufCodecBinary->decodeMessage() /usr/local/services/php-5.4.39/lib/php/DrSlump/Protobuf/Codec/Binary.php:266
    [13-Apr-2015 15:33:55 GMT] PHP  11. DrSlumpProtobufCodecBinary->getWireType() /usr/local/services/php-5.4.39/lib/php/DrSlump/Protobuf/Codec/Binary.php:249

    跟入代码发现:/usr/local/services/php-5.4.39/lib/php/DrSlump/Protobuf/Codec/Binary.php 中的第249行,

    $wire = $this->getWireType($type);

    参数传递异常。

    发现需要传入2个参数,于是修改为:

    $wire = $this->getWireType($type, null);

    重新执行

    protoc-gen-php --out=./ -i. -Dsuffix=.proto.php tutorial.proto

    生成成功:tutorial.proto.php

    另一种方式:

    protoc --plugin=/usr/local/php/bin/protoc-gen-php --php_out=. -I. tutorial.proto

    生成成功:tutorial.php

    协议已经成功生成。

  • 相关阅读:
    jenkins+docker+rancher+zikui 部署
    利用jenkins直接构件docker镜像并发布到docker服务器
    docker+Rancher+K3S
    windows使用VSCode进行Shell开发
    v-drag 弹框拖拽的实现
    vue3兄弟组件传值
    vue3 组件传值
    Azure Computer Vision 之 Smart Crop 智能裁剪图片
    ASP.NET Core 单元测试
    ASP.NET Core Static Files
  • 原文地址:https://www.cnblogs.com/brookin/p/4423692.html
Copyright © 2011-2022 走看看