背景

业务需要用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.的更多相关文章

  1. protobuffer php使用

    protobuffer是google推出的一种数据传的方式,具体压缩,体积小的特点 protobuffer本身不支持php,若要把.proto文件转化为php支持的文件,需要使用第三方的程序 alle ...

  2. Golang/Python/PHP带你彻底学会gRPC

    目录 一.gRPC是什么? 二.Protocol Buffers是什么? 三.需求:开发健身房服务 四.最佳实践 Golang 1. 安装protoc工具 2. 安装protoc-gen-go 3. ...

  3. protoc 命令参数

    protoc 命令的获得 源码在 https://github.com/google/protobuf , 如果不想自己编译获得最新版本,则可以下载官方编译好的各个平台的,下载地址:https://g ...

  4. PowerProto: gRPC工具链(protoc, protoc-gen-go)的一键安装与版本控制

    ‍PowerProto: gRPC工具链(protoc, protoc-gen-go)的一键安装与版本控制 中文 | English 项目地址:An awesome version control t ...

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

    LLBL Gen Pro是一个为.NET开发人员设计的的对象关系映射(ORM)框架,与NHibernate,Entity Framework等框架一样,通过实体与数据表的映射,实现关系数据库持久化. ...

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

    ASP.NET 5 beta2中增加了一个新特性(详见ASP.NET 5 Beta2 发布),可以通过K命令生成MVC的代码,比如:k gen controller -name HomeControl ...

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

    转自:http://blog.nathon.wang/2015/06/24/tornado-source-insight-01-gen/ 用Tornado也有一段时间,Tornado的文档还是比较匮乏 ...

  8. Erlang generic standard behaviours -- gen

    在分析 gen_server (或者是gen_fsm )之前,首先应该弄明白,gen 这个module . -module(gen). -compile({inline,[get_node/1]}). ...

  9. Tornado中gen.coroutine详解

    1.gen.coroutine的作用 自动执行生成器 2.Future对象 在介绍异步使用之前,先了解一下Future对象的作用. Future简单可以理解为一个占位符,将来会执行的对象,类似java ...

随机推荐

  1. ubuntu14.04 boost动态库找不到 libboost_system.so.1.58.0

    error while loading shared libraries: : cannot open shared object file: No such file or directory == ...

  2. 操作系统中前台进程与后台进程(适用于Linux)

    两种进程的主要区别: 1.前台进程用户可以操作,后台进程用户不能操作(除了把它关闭). 2.前台进程不全是由计算机自动控制,后台进程全都是由计算机自动控制. 3.后台进程一般用作系统服务,可以用cro ...

  3. 预处理语句--#define、#error和#warning

    1.#define语句 我们经常会这样定义一些宏:       #define BLOCK 8192 但这样的宏却不能在字符串中展开,如:    printf("The BLOCK numb ...

  4. 《Linux内核分析》课程总结

    朱宇轲 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 不知不觉,在网易 ...

  5. json格式的数组长度

    var data = [{"id":"1","name":"a"},{"id":"2&qu ...

  6. 因开启SELinux导致httpd报403

    各项权限都检查过了,SELinux允许的端口也找过了.同目录下的其他文件夹是正常的,这个文件夹就抱403. 临时关闭selinux后正常.估计是没有配置运行上下文. chcon -R -t httpd ...

  7. (medium)LeetCode 278.First Bad Version

    You are a product manager and currently leading a team to develop a new product. Unfortunately, the ...

  8. 36. Construct Binary Tree from Inorder and Postorder Traversal && Construct Binary Tree from Preorder and Inorder Traversal

    Construct Binary Tree from Inorder and Postorder Traversal OJ: https://oj.leetcode.com/problems/cons ...

  9. java中string stringbuilder stringbuffer 的区别

    1. String 类 String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间. String a = "a&qu ...

  10. CSS :hover伪类选择定义和用法

    伪类选择符E:hover的定义和用法: 设置元素在其鼠标悬停时的样式.E元素可以通过其他选择器进行选择,比如使用类选择符.id选择符.类型选择符等等.特别说明:IE6并非不支持此选择符,但能够支持a元 ...