protoc gen php,protoc-gen-php --php_out: protoc-gen-php: Plugin output is unparseable.

背景

业务需要用protobuffer 进行通讯。

client: php

server: c++

在github 上找到 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 {

requiredstring name = 1;

required int32 id= 2;

optionalstring email = 3;enumPhoneType {

MOBILE= 0;

HOME= 1;

WORK= 2;

}

message PhoneNumber {

requiredstring 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 DrSlump\Protobuf\Codec\Binary::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:55GMT] 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. DrSlump\Protobuf\Compiler\Cli::run() /usr/local/services/php-5.4.39/bin/protoc-gen-php:43[13-Apr-2015 15:33:55 GMT] PHP 3. DrSlump\Protobuf\Compiler->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. DrSlump\Protobuf\Message->__construct() /usr/local/services/php-5.4.39/lib/php/DrSlump/Protobuf/Compiler.php:104[13-Apr-2015 15:33:55 GMT] PHP 5. DrSlump\Protobuf\Message->parse() /usr/local/services/php-5.4.39/lib/php/DrSlump/Protobuf/Message.php:56[13-Apr-2015 15:33:55 GMT] PHP 6. DrSlump\Protobuf\Codec\Binary->decode() /usr/local/services/php-5.4.39/lib/php/DrSlump/Protobuf/Message.php:107[13-Apr-2015 15:33:55 GMT] PHP 7. DrSlump\Protobuf\Codec\Binary->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. DrSlump\Protobuf\Codec\Binary->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. DrSlump\Protobuf\Codec\Binary->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. DrSlump\Protobuf\Codec\Binary->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. DrSlump\Protobuf\Codec\Binary->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

协议已经成功生成。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值