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

    协议已经成功生成。

  • 相关阅读:
    阿里P8推荐的SpingBoot学习手册+Git开源项目实践分享,还不收藏
    阿里P8划重点:JVM+Spring+Mybatis+多线程高并发源码你必须会
    一线大厂工程师推荐:Mysql、Springboot、JVM、Spring等面试合集
    GitHub标星120K+的JDK并发编程指南,连续霸榜GitHub终于开源了
    腾讯被指劝退高龄员工,华为百度也在优化,互联网35岁+该怎么办
    天猫面试官硬核推荐:Dubbo+ES+JVM+多线程/高并发+消息队列
    多线程与高并发:金九银十跳槽季面试必须要掌握的硬核涨薪技能
    纯干货,源码6步曲,带你解析完整的ThreadPoolExecutor
    今日总结
    今日头条技术架构分析
  • 原文地址:https://www.cnblogs.com/brookin/p/4423692.html
Copyright © 2011-2022 走看看