如何在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程序
Oct 09 PHP
在PHP3中实现SESSION的功能(一)
Oct 09 PHP
用PHP实现维护文件代码
Jun 14 PHP
PHP 杂谈《重构-改善既有代码的设计》之一 重新组织你的函数
Apr 09 PHP
php实现检查文章是否被百度收录
Jan 27 PHP
php实现改变图片直接打开为下载的方法
Apr 14 PHP
PHP设置头信息及取得返回头信息的方法
Jan 25 PHP
Symfony2学习笔记之控制器用法详解
Mar 17 PHP
PHP简单实现模拟登陆功能示例
Sep 15 PHP
php实现算术验证码功能
Dec 05 PHP
PHP __call()方法实现委托示例
May 20 PHP
Laravel5.5 实现后台管理登录的方法(自定义用户表登录)
Sep 30 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
CodeIgniter框架过滤HTML危险代码
2014/06/12 PHP
Laravel中基于Artisan View扩展包创建及删除应用视图文件的方法
2016/10/08 PHP
clientX,pageX,offsetX,x,layerX,screenX,offsetLeft区别分析
2010/03/12 Javascript
解决IE下select标签innerHTML插入option的BUG(兼容IE,FF,Opera,Chrome,Safari)
2010/05/13 Javascript
javascript天然的迭代器
2010/10/29 Javascript
体验js中splice()的强大(插入、删除或替换数组的元素)
2013/01/16 Javascript
JavaScript极简入门教程(二):对象和函数
2014/10/25 Javascript
基于jQuery创建鼠标悬停效果的方法
2015/03/07 Javascript
jQuery中hover与mouseover和mouseout的区别分析
2015/12/24 Javascript
JavaScript必知必会(六) delete in instanceof
2016/06/08 Javascript
Ubuntu 16.04 64位中搭建Node.js开发环境教程
2016/10/19 Javascript
jQuery的Read()方法代替原生JS详解
2016/11/08 Javascript
微信小程序出现wx.navigateTo页面不跳转问题的解决方法
2017/12/26 Javascript
详解Vue 多级组件透传新方法provide/inject
2018/05/09 Javascript
解决bootstrap模态框数据缓存的问题方法
2018/08/10 Javascript
python 图片验证码代码分享
2012/07/04 Python
python利用ffmpeg进行录制屏幕的方法
2019/01/10 Python
解析Python的缩进规则的使用
2019/01/16 Python
Python3.6实现带有简单界面的有道翻译小程序
2019/04/16 Python
python3实现带多张图片、附件的邮件发送
2019/08/10 Python
python使用QQ邮箱实现自动发送邮件
2020/06/22 Python
Python图像处理二值化方法实例汇总
2020/07/24 Python
html5配合css3实现带提示文字的输入框(摆脱js)
2013/03/08 HTML / CSS
拉斯维加斯城市观光通行证:Las Vegas Pass
2019/05/21 全球购物
李维斯牛仔裤英国官方网站:Levi’s英国
2019/10/10 全球购物
水务局局长岗位职责
2013/11/28 职场文书
新驾驶员个人自我评价
2014/01/03 职场文书
《要下雨了》教学反思
2014/02/17 职场文书
教师求职信范文
2014/05/24 职场文书
党员四风剖析材料
2014/08/27 职场文书
小学生勤俭节约演讲稿
2014/08/28 职场文书
解除劳动合同协议书范本
2014/09/13 职场文书
新生入学欢迎词
2015/01/26 职场文书
2015毕业寄语大全
2015/02/26 职场文书
2015年度培训工作总结范文
2015/04/02 职场文书
2015年效能监察工作总结
2015/04/23 职场文书