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
协议已经成功生成。
protoc-gen-php --php_out: protoc-gen-php: Plugin output is unparseable.的更多相关文章
- protobuffer php使用
protobuffer是google推出的一种数据传的方式,具体压缩,体积小的特点 protobuffer本身不支持php,若要把.proto文件转化为php支持的文件,需要使用第三方的程序 alle ...
- Golang/Python/PHP带你彻底学会gRPC
目录 一.gRPC是什么? 二.Protocol Buffers是什么? 三.需求:开发健身房服务 四.最佳实践 Golang 1. 安装protoc工具 2. 安装protoc-gen-go 3. ...
- protoc 命令参数
protoc 命令的获得 源码在 https://github.com/google/protobuf , 如果不想自己编译获得最新版本,则可以下载官方编译好的各个平台的,下载地址:https://g ...
- PowerProto: gRPC工具链(protoc, protoc-gen-go)的一键安装与版本控制
PowerProto: gRPC工具链(protoc, protoc-gen-go)的一键安装与版本控制 中文 | English 项目地址:An awesome version control t ...
- 解析大型.NET ERP系统数据访问 对象关系映射框架LLBL Gen Pro
LLBL Gen Pro是一个为.NET开发人员设计的的对象关系映射(ORM)框架,与NHibernate,Entity Framework等框架一样,通过实体与数据表的映射,实现关系数据库持久化. ...
- Mac中体验ASP.NET 5 beta2的K gen代码生成
ASP.NET 5 beta2中增加了一个新特性(详见ASP.NET 5 Beta2 发布),可以通过K命令生成MVC的代码,比如:k gen controller -name HomeControl ...
- Tornado源码分析系列之一: 化异步为'同步'的Future和gen.coroutine
转自:http://blog.nathon.wang/2015/06/24/tornado-source-insight-01-gen/ 用Tornado也有一段时间,Tornado的文档还是比较匮乏 ...
- Erlang generic standard behaviours -- gen
在分析 gen_server (或者是gen_fsm )之前,首先应该弄明白,gen 这个module . -module(gen). -compile({inline,[get_node/1]}). ...
- Tornado中gen.coroutine详解
1.gen.coroutine的作用 自动执行生成器 2.Future对象 在介绍异步使用之前,先了解一下Future对象的作用. Future简单可以理解为一个占位符,将来会执行的对象,类似java ...
随机推荐
- 一加3,CM13蓝牙共享互联网 无效。
一加3准备把4G网络共享给魅族PRO5. 但在一加3的蓝牙设置里怎么勾选都无用. 最后发现在要在PRO5上设置才行. 1.在蓝牙列表中,点击带圈的感叹号. 2.选择“互联网访问”. - --
- iOS沙盒机制介绍,Block 的介绍
一.iOS沙盒机制介绍 (转载) 1)概念:每个ios应用都有自己的应用沙盒,应用沙盒就是文件系统目录,与其他应用放入文件 系统隔离,ios系统不允许访问 其他应用的应用沙盒,但在ios8中已经开放访 ...
- 在Label中显示一段文字
Let’s create a new Xamarin.Forms PCL solution, named Greetings, using the same process described abo ...
- JavaScript插件架构
1.HTML布局规则 默认情况下,所有的插件都可以通过设置特定的HTML代码和相应的属性来实现.也就是说,在网页加载的时候,JavaScript代码会自动检测这些标记,并自动绑定相应的事件,而无需添加 ...
- Hololens开发笔记之Gesture手势识别(单击,双击)
本文使用手势识别实现识别单击及双击手势的功能,当单击Cube时改变颜色为蓝色,当双击Cube时改变颜色为绿色. 手势识别是HoloLens交互的重要输入方法之一.HoloLens提供了底层API和高层 ...
- [ActionScript 3.0] AS3.0 复制xml,并赋值
var template:XML= <person><name><first>FIRST</first><last /></name& ...
- 全面了解 Linux 服务器 - 4. 查看 Linux 系统的平均负载
可使用 uptime.top.w 命令来查看. 以 uptime 命令为例: liuqian@ubuntu:~$ uptime 17:31:26 up 7:27, 2 users, load aver ...
- 玩转单元测试之WireMock -- Web服务模拟器
玩转单元测试之WireMock -- Web服务模拟器 WireMock 是一个灵活的库用于 Web 服务测试,和其他测试工具不同的是,WireMock 创建一个实际的 HTTP服务器来运行你的 We ...
- Js_Ajax_用户名检测
输入"root",OK:输入其它,Error ajax.jsp var xhr; function createXhr() { if (window.XMLHttpRequest) ...
- SHELL脚本攻略(学习笔记)--2.4 find
转载请注明出处:http://www.cnblogs.com/f-ck-need-u/p/5916657.html 超级强大的find命令. find搜索是从磁盘搜索,而不是从数据库搜索. 2.4 ...