12 9 6 3
just a phper
关于google/protobuff的探究

前言

在一家公司遇到了protobuff这东西,C++小组用protobuff格式存储数据, 要求php这边读取解析数据
于是,对protobuff进行了探究以及使用
protobuff
据百度百科,protobuff 全称是 protocolbuffer , 是google 的一种数据交换的格式,它独立于语言,独立于平台。
由于它是一种二进制的格式,比使用 xml 进行数据交换快许多。
可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。
作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。

初步分析

那时候protobuff版本是proto2,并没有支持php, 大概是 在 2016-10的proto3版本支持了php
一开始不支持的时候, 有两种解决方法:
1、根据protobuff压数据的格式,通过unpack解压数据,难度大工作量大
2、用第三方开源库,方便,工作量少,但是不大信任这种第三方库
一时间没有我满意的解决办法,先通过其他方式满足了需求
后来官方出了支持php的版本
github源码地址:github_protobuff
官网文档:protobuff_doc

安装以及使用

  • 先通过composer加载googole/protobuf
  • cd ext/google/protobuf pear package sudo pecl install protobuf-{VERSION}.tgz
  • 安装编译工具protoc 下载地址:protoc
  • 最后用protoc编译proto数据结构文件即可生成php相关类,protoc --php_out=out_dir test.proto
  • 生成相关php类之后, 通过composer dump-autoload --optimize 加载相关类即可

遇到的问题

由于我们C++组用proto2 来编写数据结构的
导致proto3版本的编译程序无法编译,
所以得先把C++组提供的.proto文件转换成proto3文件
但是官方并没有提供一个版本转换软件
只能看文档,把版本差异的地方修正过来

添加语法标识 :syntax = "proto3";
optional不需要了,只保留repeated标记数组类型, optional和required都被去掉了
map支持,map编写格式为:map<key_type, value_type> map_field = N;
字段default标记不能使用了,
枚举默认值一定是0
泛型描述支持,any类型, 可以代表任何类型
支持json序列化

php
自由转载-非商用-非衍生-保持署名(创意共享3.0许可证