如何在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的ob_start() 控制您的浏览器cache
Aug 03 PHP
php中定义网站根目录的常用方法
Aug 08 PHP
PHP $_FILES函数详解
Mar 09 PHP
php array_map()数组函数使用说明
Jul 12 PHP
php计算数组不为空元素个数的方法
Jan 27 PHP
php时间戳转换的示例
Mar 31 PHP
thinkphp获取栏目和文章当前位置的方法
Oct 29 PHP
PHP简单处理表单输入的特殊字符的方法
Feb 03 PHP
PHP简单读取PDF页数的实现方法
Jul 21 PHP
PHP使用两个栈实现队列功能的方法
Jan 15 PHP
PHP结合jquery ajax实现上传多张图片,并限制图片大小操作示例
Mar 01 PHP
详解PHP变量传值赋值和引用赋值变量销毁
Mar 23 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生成缩略图的代码
2011/01/12 PHP
thinkphp模板输出技巧汇总
2014/11/24 PHP
php通过获取头信息判断图片类型的方法
2015/06/26 PHP
thinkphp框架实现数据添加和显示功能
2016/06/29 PHP
PHP自定义图片缩放函数实现等比例不失真缩放的方法
2016/08/19 PHP
JavaScript 原型与继承说明
2010/06/09 Javascript
JQuery动态创建DOM、表单元素的实现代码
2011/08/09 Javascript
从数据结构分析看:用for each...in 比 for...in 要快些
2013/04/17 Javascript
Javascript WebSocket使用实例介绍(简明入门教程)
2014/04/16 Javascript
node.js中的console.error方法使用说明
2014/12/10 Javascript
jquery中map函数遍历数组用法实例
2015/05/18 Javascript
深入理解jquery中的each用法
2016/12/14 Javascript
jQuery插件form-validation-engine正则表达式操作示例
2017/02/09 Javascript
Vue2组件tree实现无限级树形菜单
2017/03/29 Javascript
vue双向绑定数据限制长度的方法
2019/11/04 Javascript
java遇到微信小程序 &quot;支付验证签名失败&quot; 问题解决
2019/12/22 Javascript
vue 项目中当访问路由不存在的时候默认访问404页面操作
2020/08/31 Javascript
OpenLayers3实现图层控件功能
2020/09/25 Javascript
Python编程django实现同一个ip十分钟内只能注册一次
2017/11/03 Python
MAC中PyCharm设置python3解释器
2017/12/15 Python
python爬虫 urllib模块url编码处理详解
2019/08/20 Python
基于K.image_data_format() == 'channels_first' 的理解
2020/06/29 Python
详解Django中views数据查询使用locals()函数进行优化
2020/08/24 Python
Python爬取豆瓣数据实现过程解析
2020/10/27 Python
html5新增的定时器requestAnimationFrame实现进度条功能
2018/12/13 HTML / CSS
丝芙兰波兰:Sephora.pl
2018/03/25 全球购物
Regatta官网:英国最受欢迎的户外服装和鞋类品牌
2019/05/01 全球购物
Sperry澳大利亚官网:源自美国帆船鞋创始品牌
2019/07/29 全球购物
方法名是否可以与构造器的名字相同
2012/06/04 面试题
销售助理岗位职责
2014/02/21 职场文书
销售经理竞聘书
2014/03/31 职场文书
2014年财政局工作总结
2014/12/09 职场文书
介绍信模板
2015/01/31 职场文书
校园音乐节目广播稿
2015/08/19 职场文书
人生一定要学会的三样东西:放下、忘记、珍惜
2019/08/21 职场文书
css filter和getUserMedia的联合使用
2022/02/24 HTML / CSS