
正文
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 = ;
required int32 id = ;
optional string email = ;
enum PhoneType {
MOBILE = ;
HOME = ;
WORK = ;
}
message PhoneNumber {
required string number = ;
optional PhoneType type = [default = HOME];
}
repeated PhoneNumber phone = ;
}
message AddressBook {
repeated Person person = ;
}
定位与解决
PHP日志跟踪发现:
[-Apr- :: GMT] PHP Warning: Missing argument for DrSlump\Protobuf\Codec\Binary::getWireType(), called in /usr/local/services/php-5.4./lib/php/DrSlump/Protobuf/Codec/Binary.php on line and defined in /usr/local/services/php-5.4./lib/php/DrSlump/Protobuf/Codec/Binary.php on line
[-Apr- :: GMT] PHP Stack trace:
[-Apr- :: GMT] PHP . {main}() /usr/local/services/php-5.4./bin/protoc-gen-php:
[-Apr- :: GMT] PHP . DrSlump\Protobuf\Compiler\Cli::run() /usr/local/services/php-5.4./bin/protoc-gen-php:
[-Apr- :: GMT] PHP . DrSlump\Protobuf\Compiler->compile() /usr/local/services/php-5.4./lib/php/DrSlump/Protobuf/Compiler/Cli.php:
[-Apr- :: GMT] PHP . DrSlump\Protobuf\Message->__construct() /usr/local/services/php-5.4./lib/php/DrSlump/Protobuf/Compiler.php:
[-Apr- :: GMT] PHP . DrSlump\Protobuf\Message->parse() /usr/local/services/php-5.4./lib/php/DrSlump/Protobuf/Message.php:
[-Apr- :: GMT] PHP . DrSlump\Protobuf\Codec\Binary->decode() /usr/local/services/php-5.4./lib/php/DrSlump/Protobuf/Message.php:
[-Apr- :: GMT] PHP . DrSlump\Protobuf\Codec\Binary->decodeMessage() /usr/local/services/php-5.4./lib/php/DrSlump/Protobuf/Codec/Binary.php:
[-Apr- :: GMT] PHP . DrSlump\Protobuf\Codec\Binary->decodeMessage() /usr/local/services/php-5.4./lib/php/DrSlump/Protobuf/Codec/Binary.php:
[-Apr- :: GMT] PHP . DrSlump\Protobuf\Codec\Binary->decodeMessage() /usr/local/services/php-5.4./lib/php/DrSlump/Protobuf/Codec/Binary.php:
[-Apr- :: GMT] PHP . DrSlump\Protobuf\Codec\Binary->decodeMessage() /usr/local/services/php-5.4./lib/php/DrSlump/Protobuf/Codec/Binary.php:
[-Apr- :: GMT] PHP . DrSlump\Protobuf\Codec\Binary->getWireType() /usr/local/services/php-5.4./lib/php/DrSlump/Protobuf/Codec/Binary.php:
跟入代码发现:/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
协议已经成功生成。





