如何在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 相关文章推荐
第七节--类的静态成员
Nov 16 PHP
php环境配置 php5 mysql5 apache2 phpmyadmin安装与配置
Nov 17 PHP
PHP测试程序运行时间的类
Feb 05 PHP
Smarty的配置与高级缓存技术分享
Jun 05 PHP
phpword插件导出word文件时中文乱码问题处理方案
Aug 19 PHP
微信公众平台接口开发入门示例
Dec 24 PHP
php提高网站效率的技巧
Sep 29 PHP
利用Fix Rss Feeds插件修复WordPress的Feed显示错误
Dec 19 PHP
php判断str字符串是否是xml格式数据的方法示例
Jul 26 PHP
Laravel框架路由设置与使用示例
Jun 12 PHP
php微信公众号开发之图片回复
Oct 20 PHP
php字符串倒叙
Apr 01 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
15个小时----从修改程序到自己些程序
2006/10/09 PHP
php实现mysql数据库操作类分享
2014/02/14 PHP
php强制下载文件函数
2016/08/24 PHP
Laravel Eloquent ORM 多条件查询的例子
2019/10/10 PHP
50款非常棒的 jQuery 插件分享
2012/03/29 Javascript
Textarea根据内容自适应高度
2013/10/28 Javascript
js判断浏览器类型为ie6时不执行
2014/06/15 Javascript
jquery validate demo 基础
2015/10/29 Javascript
angular.js之路由的选择方法
2016/09/24 Javascript
功能强大的jquery.validate表单验证插件
2016/11/07 Javascript
vue.js事件处理器是什么
2017/03/20 Javascript
jQuery插件FusionCharts绘制2D双折线图效果示例【附demo源码】
2017/04/14 jQuery
Vue.set() this.$set()引发的视图更新思考及注意事项
2018/08/30 Javascript
微信小程序Echarts图表组件使用方法详解
2019/06/25 Javascript
你可能从未使用过的11+个JavaScript特性(小结)
2020/01/08 Javascript
vue-cli3单页构建大型项目方案
2020/04/07 Javascript
js实现简单的贪吃蛇游戏
2020/04/23 Javascript
详解JavaScript 中的批处理和缓存
2020/11/19 Javascript
[02:39]DOTA2英雄基础教程 极限穿梭编织者
2013/12/05 DOTA
[35:29]Secret vs VG 2018国际邀请赛淘汰赛BO3 第三场 8.23
2018/08/24 DOTA
详解Python编程中对Monkey Patch猴子补丁开发方式的运用
2016/05/27 Python
PYTHON 中使用 GLOBAL引发的一系列问题
2016/10/12 Python
Python3.6安装及引入Requests库的实现方法
2018/01/24 Python
python实现的按要求生成手机号功能示例
2019/10/08 Python
基于spring boot 日志(logback)报错的解决方式
2020/02/20 Python
Python实现自动签到脚本的示例代码
2020/08/19 Python
Python实现Excel自动分组合并单元格
2021/02/22 Python
canvas粒子动画背景的实现示例
2018/09/03 HTML / CSS
eBay法国购物网站:eBay.fr
2017/10/21 全球购物
一家专门经营包包的英国网站:MyBag
2019/09/08 全球购物
Linux的文件类型
2016/07/05 面试题
【魔兽争霸3重制版】原版画面与淬火MOD画面对比
2021/03/26 魔兽争霸
高分子材料与工程专业个人求职信
2013/12/15 职场文书
家长写给孩子的评语
2014/04/18 职场文书
纪检干部对照检查材料
2014/08/22 职场文书
先进教师个人总结
2015/02/11 职场文书