如何在PHP环境中使用ProtoBuf数据格式


Posted in PHP onJune 19, 2020

前言

  RPC是google公司主导的一款RPC框架,并使用protobuf作为数据传输格式,伴随gRPC框架的成熟及使用人群的增加,对于底层使用的数据格式protobuf也被越来越受到重视,而对于PHP生态而言,相关ProtoBuf介绍文档及使用资料比较少,故此写简文希望能帮助到一些有需要的同学。

  ProtoBuf (Google Protocol Buffer)是由google公司用于数据交换的序列结构化数据格式,具有跨平台、跨语言、可扩展特性,类型于常用的XML及JSON,但具有更小的传输体积、更高的编码、解码能力,特别适合于数据存储、网络数据传输等对存储体积、实时性要求高的领域。

  目前官方ProtoBuf 最新版本ProtoBuf3,已经支持多种语言:C++\C#\Go\Java\Python\Ruby\Object C \Javascript\PHP,并且提供工具很方便地根据不同语言产生ProtoBuf需要的类库。

  下面将通过Person数据格式作为示例进行描述如果在PHP环境中如何使用ProtoBuf3。

一、定义一个消息类型

创建一个关于Person的定义文件(以.proto为后缀),如示例为person.proto,文件内容如下:

syntax="proto3";
package test;
message Person{
 string name=1;//姓名
 int32 age=2;//年龄
 bool sex=3;//性别
}

1、syntax="proto3":表明使用的是proto3格式,如果不指定则为proto2

2、package test:定义包名为test,生成类时,会产生一个目录为test

3、message Person:消息主体内容,里面为各个字段的定义

二、生成对应的PHP类

定义好Person的格式后,该格式如果不生成我们所需要的类库,其实是无任何意义的,还google提供一个工具protoc生成我们要的类库。

1、安装protoc

安装地址:protobuf-php-3.5.1.tar.gz,目前最新为3.5.1

官方发布地址:https://github.com/google/protobuf/releases/tag/v3.5.1

解压并安装:

tar -zxvf protobuf-php-3.5.1.tar.gz
cd protobuf-3.5.1
./configure --prefix=/opt/soft/protobuf
make
make install

2、生成类库

/opt/soft/protobuf/bin/protoc --php_out=./ person.proto

生成后将在当前目录产生如下文件:

GPBMetadata/Person.php

Test/Person.php

三、在PHP中使用ProtoBuf

在PHP中使用ProtoBuf依赖一个protobuf的扩展,目前提供两种方式进行使用,1:php的c扩展,2:php的lib扩展包,这两者均可在刚才下载包里可以找到。

另外,也可以使用composer进行安装该依赖扩展:composer require google/protobuf

这里我主要是使用composer安装,应该它可以帮我产生autoload

安装好依赖后,我们就可以开始在php环境下使用protobuf了

1、序列化

<?php
include 'vendor/autoload.php';
include 'GPBMetadata/Person.php';
include 'Test/Person.php';

$person = new Test\Person();
$person->setName("lailaiji");
$person->setAge("28");
$person->setSex(true);
$data = $person->serializeToString();
file_put_contents('data.bin',$data);

2、反序列化

<?php
include 'vendor/autoload.php';
include 'GPBMetadata/Person.php';
include 'Test/Person.php';
$bindata = file_get_contents('./data.bin');
$person = new Test\Person();
$person->mergeFromString($bindata);
echo $person->getName();

可以正常地输出lailaiji

PHP常用的使用方法:

序列化:

1、serializeToString:序列化成二进制字符串

2、serializeToJsonString:序列化成JSON字符串

反序列化:

1、mergeFromString:二进制字符串反序列化

2、mergeFromJsonString:Json字符串反序列化

.proto的message解析

1、定义:

类型 变量名=位置;

如:int32 age=1;

这里需要区分,变量名后面的数字意义为该变量内容在二进制序列中的位置而不是变量的值,该数字必须是唯一不可重复使用。

2、目前支持的类型:

double,float,int32,int64,uint32 ,uint64,sint32,sint64

fixed32,fixed64,sfixed32,sfixed64,bool,bytes

性能测试

https://github.com/eishay/jvm-serializers/wiki

1、序列号+反序列号时间:

image.png

2、存储大小:

image.pn

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
php 设计模式之 单例模式
Dec 19 PHP
PHP 开发环境配置(Zend Studio)
Apr 28 PHP
解析php二分法查找数组是否包含某一元素
May 23 PHP
解析wamp5下虚拟机配置文档
Jun 27 PHP
php输出xml必须header的解决方法
Oct 17 PHP
如何使用GDB调试PHP程序
Dec 08 PHP
WordPress特定文章对搜索引擎隐藏或只允许搜索引擎查看
Dec 31 PHP
PHP程序员的技术成长规划
Mar 25 PHP
laravel5.4生成验证码的实例讲解
Aug 05 PHP
php实现的AES加密类定义与用法示例
Jan 29 PHP
PHP实现断点续传乱序合并文件的方法
Sep 06 PHP
php实现分页功能的详细实例方法
Sep 29 PHP
基于PHP实现堆排序原理及实例详解
Jun 19 #PHP
深入分析PHP设计模式
Jun 15 #PHP
Laravel6.18.19如何优雅的切换发件账户
Jun 14 #PHP
Laravel服务容器绑定的几种方法总结
Jun 14 #PHP
Laravel如何实现适合Api的异常处理响应格式
Jun 14 #PHP
Yii redis集合的基本使用教程
Jun 14 #PHP
php获取小程序码的实现代码(B类接口)
Jun 13 #PHP
You might like
php以post形式发送xml的方法
2014/11/04 PHP
WebQQ最新登陆协议的用法
2014/12/22 PHP
PHP的引用详解
2015/02/22 PHP
分享一个漂亮的php验证码类
2016/09/29 PHP
JS 两日期相减,获得天数的小例子(兼容IE,FF)
2013/07/01 Javascript
cookie中的path与domain属性详解
2013/12/18 Javascript
使用jquery实现IE下按backspace相当于返回操作
2014/03/18 Javascript
谈谈我对JavaScript中typeof和instanceof的深入理解
2015/12/25 Javascript
js实现带农历和八字等信息的日历特效
2016/05/16 Javascript
AngularJS基础 ng-copy 指令实例代码
2016/08/01 Javascript
React 高阶组件入门介绍
2018/01/11 Javascript
Vue+webpack项目基础配置教程
2018/02/12 Javascript
关于AOP在JS中的实现与应用详解
2019/05/06 Javascript
javascript防抖函数debounce详解
2019/06/11 Javascript
vue基于better-scroll实现左右联动滑动页面
2020/06/30 Javascript
JavaScript实现串行请求的示例代码
2020/09/14 Javascript
vue中watch的用法汇总
2020/12/28 Vue.js
[43:47]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#2 MVP.Phx VS Fnatic第一局
2016/03/05 DOTA
[14:50]2018DOTA2亚洲邀请赛开幕式
2018/04/03 DOTA
[03:08]迎霜节狂欢!2018年迎霜节珍藏Ⅰ一览
2018/12/25 DOTA
Python正则表达式匹配ip地址实例
2014/10/09 Python
Python模仿POST提交HTTP数据及使用Cookie值的方法
2014/11/10 Python
Python实现比较扑克牌大小程序代码示例
2017/12/06 Python
hmac模块生成加入了密钥的消息摘要详解
2018/01/11 Python
利用python GDAL库读写geotiff格式的遥感影像方法
2018/11/29 Python
Python使用APScheduler实现定时任务过程解析
2019/09/11 Python
python读写数据读写csv文件(pandas用法)
2020/12/14 Python
html5指南-4.使用Geolocation实现定位功能
2013/01/07 HTML / CSS
BONIA官方网站:国际奢侈品牌和皮革专家
2016/11/27 全球购物
来自南加州灵感的工作和娱乐服装:TravisMathew
2019/05/01 全球购物
大学生四年生活自我鉴定
2013/11/21 职场文书
人事行政主管岗位职责
2013/12/22 职场文书
党员四风剖析材料
2014/08/27 职场文书
建筑技术负责人岗位职责
2015/04/13 职场文书
2015年秋季运动会加油稿
2015/07/22 职场文书
java固定大小队列的几种实现方式详解
2021/07/15 Java/Android