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 ...
随机推荐
- HTML5外包
北京动点飞扬软件 从事html5外包业务五年,是国内第一家以HTML5移动平台.手机平台项目外包业务为主的正规软件团队, 欢迎联系 QQ:372900288 电话:13911652504 我们现已发展 ...
- .net4缓存笔记
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...
- 【总结】我所整理的float, inline-block还有position:absolute
这篇主要写了一下几个知识点: 浮动和inline-block的概念和选择 浮动和position:absolute对于脱离文档流的区别 这篇文章参考了一下几个链接: https://www.zhihu ...
- [Tex学习笔记]积分平均
$\def\avint{\mathop{\mathchoice{\,\rlap{-}\!\!\int} {\rlap{\raise.15em{\scriptstyle -}}\kern-.2em\in ...
- nodejs初探(一)环境搭建,开发工具安装
简介 JavaScript是一种运行在浏览器的脚本,它简单,轻巧,易于编辑,这种脚本通常用于浏览器的前端编程,但是一位开发者Ryan有一天发现这种前端式的脚本语言可以运行在服务器上的时候,一场席卷全球 ...
- Lambda表达式的演化,委托-匿名方法-Func-Lambda
匿名方法 很多时候委托接收的方法是一次性的或者方法体是非常简单的... 例三: 我们可以写成: 有没有发现我们每次都要定义委托,很多时候签名可能是一样的.这样就没有必要定义重复的. 然后又过了很久很久 ...
- operator 的两种用法
C++,有时它的确是个耐玩的东东,就比如operator,它有两种用法,一种是operator overloading(操作符重载),一种是operator casting(操作隐式转换).1.操作符 ...
- jQuery最佳编程实践
加载jQuery 1.坚持使用CDN来加载jQuery,这种别人服务器免费帮你托管文件的便宜干嘛不占呢.点击查看使用CDN的好处,点此查看一些主流的jQuery CDN地址. <script t ...
- IDE神器intellij idea的基本使用
摘自: http://www.cnblogs.com/newpanderking/p/4887981.html 一.编码快捷键(比较常用的快捷键)该套快捷键选择的是:Mac OS X 10.5+ 1. ...
- Linux网络状态工具ss命令使用详解
ss命令用于显示socket状态. 他可以显示PACKET sockets, TCP sockets, UDP sockets, DCCP sockets, RAW sockets, Unix dom ...