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 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: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. 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

协议已经成功生成。

时间: 2024-08-26 12:52:20

protoc-gen-php --php_out: protoc-gen-php: Plugin output is unparseable.的相关文章

protobuffer php使用

protobuffer是google推出的一种数据传的方式,具体压缩,体积小的特点 protobuffer本身不支持php,若要把.proto文件转化为php支持的文件,需要使用第三方的程序 allegro/php-protobuf 或 drslump/Protobuf-PHP 参考 http://yueqian.sinaapp.com/a/52.html http://hello1010.com/php-protobuf 使用drslump/Protobuf-PHP 一.下载并安装protoc

gRPC最佳入门教程,Golang/Python/PHP多语言讲解

目录 一.gRPC是什么? 二.Protocol Buffers是什么? 三.需求:开发健身房服务 四.最佳实践 Golang 1. 安装protoc 2. 安装protoc-gen-go 3. 安装grpc包 4. 生成代码 5. 定义服务端 6. 定义客户端 7. 运行代码 Python 1. 安装grpc包 2. 安装protobuf 3. 安装grpc的protobuf编译工具 4. 生成代码 5. 定义服务端 6. 定义客户端 7. 运行代码 PHP 1. 安装protoc 2. 安装

Mac中体验ASP.NET 5 beta2的K gen代码生成

ASP.NET 5 beta2中增加了一个新特性(详见ASP.NET 5 Beta2 发布),可以通过K命令生成MVC的代码,比如:k gen controller -name HomeController. 如果你用的是Visual Studio,自然对这个功能不以为然,因为Visual Studio帮你干了. 如果你用的是Mac,没有Visual Studio,也没有K Studio,不想自虐手写本可以通过模板生成的MVC代码,这个特性就值得关注了. 由于对Mac下写ASP.NET代码垂涎已

Tornado源码分析系列之一: 化异步为'同步'的Future和gen.coroutine

转自:http://blog.nathon.wang/2015/06/24/tornado-source-insight-01-gen/ 用Tornado也有一段时间,Tornado的文档还是比较匮乏的,但是幸好其代码短小精悍,很有可读性,遇到问题时总是习惯深入到其源码中.这对于提升自己的Python水平和对于网络及HTTP的协议的理解也很有帮助.本文是Tornado源码系列的第一篇文章,网上关于Tornado源码分析的文章也不少,大多是从Event loop入手,分析Event loop的工作

家谱(gen)

题目描述 输入文件名 GEN.IN 输出文件名    GEN.OUT 时间限制      2S 现代的人对于本家族血统越来越感兴趣,现在给出充足的父子关系,请你编写程序找到某个人的最早的祖先. 输入 输入文件由多行组成,首先是一系列有关父子关系的描述,其中每一组父子关系由二行组成,用#name的形式描写一组父子关系中的父亲的名字,用+name的形式描写一组父子关系中的儿子的名字:接下来用?name的形式表示要求该人的最早的祖先:最后用单独的一个$表示文件结束.规定每个人的名字都有且只有6个字符,

解析大型.NET ERP系统数据访问 对象关系映射框架LLBL Gen Pro

LLBL Gen Pro是一个为.NET开发人员设计的的对象关系映射(ORM)框架,与NHibernate,Entity Framework等框架一样,通过实体与数据表的映射,实现关系数据库持久化. 1  LLBL Gen Pro 入门  LLBL Gen Pro Basic 打开LLBL Gen Pro程序,在右边的数据库浏览器(Catelog Explorer)中根结点右键选择从关系数据库创建关系模型( Add Relational Model Data from a Database),然

win7如何安装maven、安装protoc

问题导读1.protoc安装需要安装哪些软件?2.如何验证maven是否安装成功?3.如何验证protoc是否安装成功 ? 一.安装mvaven包 1.首先我们下载maven包 apache-maven-3.2.1.zip链接:http://pan.baidu.com/s/1jG9QhWa 密码:vmee 2.配置maven (1)解压到E盘 <ignore_js_op> (2)进入环境变量 <ignore_js_op> (3)配置环境变量 配置M2_HOME变量名: M2_HOM

The check_ping Plugin

https://www.monitoring-plugins.org/doc/man/check_ping.html check_ping v2.2.git (monitoring-plugins 2.2) Copyright (c) 1999 Ethan Galstad <[email protected]> Copyright (c) 2000-2007 Monitoring Plugins Development Team <[email protected]> Use pi

GOOGLE PROTOBUF开发者指南

ProtoBuf开发者指南 译者: gashero 目录 1   概览 1.1   什么是protocol buffer 1.2   他们如何工作 1.3   为什么不用XML? 1.4   听起来像是为我的解决方案,如何开始? 1.5   一点历史 2   语言指导 2.1   定义一个消息类型 2.2   值类型 2.3   可选字段与缺省值 2.4   枚举 2.5   使用其他消息类型 2.6   嵌套类型 2.7   更新一个数据类型 2.8   扩展 2.9   包 2.10   定