如何在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函数spl_autoload_register()用法和__autoload()介绍
Feb 04 PHP
详解PHP中strlen和mb_strlen函数的区别
Mar 07 PHP
Yii操作数据库的3种方法
Mar 11 PHP
PHP将回调函数作用到给定数组单元的方法
Aug 19 PHP
php防止站外远程提交表单的方法
Oct 20 PHP
Yii框架登录流程分析
Dec 03 PHP
php中使用url传递数组的方法
Feb 11 PHP
在WordPress中获取数据库字段内容和添加主题设置菜单
Jan 11 PHP
详解PHP中cookie和session的区别及cookie和session用法小结
Jun 12 PHP
php blowfish加密解密算法
Jul 02 PHP
php制作圆形用户头像的实例_自定义封装类源代码
Sep 18 PHP
Laravel框架查询构造器简单示例
May 08 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运行时动态创建函数的方法
2015/03/16 PHP
PHP SPL标准库之接口(Interface)详解
2015/05/11 PHP
Symfony2学习笔记之插件格式分析
2016/03/17 PHP
php表单处理操作
2017/11/16 PHP
PHP设计模式之装饰器模式定义与用法详解
2018/04/02 PHP
Javascript-Mozilla和IE中的一个函数直接量的问题
2007/01/09 Javascript
jquery ready()的几种实现方法小结
2010/06/18 Javascript
jquery实现手机发送验证码的倒计时代码
2014/02/12 Javascript
JS和函数式语言的三特性
2014/03/05 Javascript
JavaScript实现找质数代码分享
2015/03/24 Javascript
javascript显示中文日期的方法
2015/06/18 Javascript
jquery实现的蓝色二级导航条效果代码
2015/08/24 Javascript
AngularJS入门教程之数据绑定用法示例
2016/11/01 Javascript
BootStrap table使用方法分析
2016/11/08 Javascript
js仿新浪微博消息发布功能
2017/02/17 Javascript
JS控件bootstrap datepicker使用方法详解
2017/03/25 Javascript
详解Vue使用 vue-cli 搭建项目
2017/04/20 Javascript
解决使用Vue.js显示数据的时,页面闪现原始代码的问题
2018/02/11 Javascript
vue计算属性无法监听到数组内部变化的解决方案
2019/11/06 Javascript
JavaScript数组去重实现方法小结
2020/01/17 Javascript
js实现百度淘宝搜索功能
2020/02/17 Javascript
JavaScript实现像雪花一样的Hexaflake分形
2020/07/07 Javascript
[04:29]DOTA2亚洲邀请赛小组赛第一日 TOP10精彩集锦
2015/02/01 DOTA
[47:42]Fnatic vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
使用PYTHON创建XML文档
2012/03/01 Python
Python中动态获取对象的属性和方法的教程
2015/04/09 Python
python写入xml文件的方法
2015/05/08 Python
Python2与python3中 for 循环语句基础与实例分析
2017/11/20 Python
对pandas中时间窗函数rolling的使用详解
2018/11/28 Python
python 队列基本定义与使用方法【初始化、赋值、判断等】
2019/10/24 Python
Python如何实现自带HTTP文件传输服务
2020/07/08 Python
养牛场项目建议书
2014/05/13 职场文书
关于感恩的演讲稿400字
2014/08/26 职场文书
考研导师推荐信范文
2015/03/27 职场文书
自考生自我评价
2019/06/21 职场文书
初中生入团申请书范文(五篇)
2019/10/16 职场文书