如何在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 相关文章推荐
杏林同学录(五)
Oct 09 PHP
对squid中refresh_pattern的一些理解和建议
Apr 17 PHP
PHP setcookie指定domain参数后,在IE下设置cookie失效的解决方法
Sep 09 PHP
PHP更新购物车数量(表单部分/PHP处理部分)
May 03 PHP
解析PHP SPL标准库的用法(遍历目录,查找固定条件的文件)
Jun 18 PHP
解析PHP中的unset究竟会不会释放内存
Jul 18 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十)
Jun 24 PHP
PHP实现将MySQL重复ID二维数组重组为三维数组的方法
Aug 01 PHP
PHP未登录自动跳转到登录页面
Dec 21 PHP
php利用嵌套数组拼接与解析json的方法
Feb 07 PHP
form自动提交实例讲解
Jul 10 PHP
PHP自定义函数判断是否为Get、Post及Ajax提交的方法
Jul 27 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
从零开始学YII2框架(五)快速生成代码工具 Gii 的使用
2014/08/20 PHP
WordPress开发中短代码的实现及相关函数使用技巧
2016/01/05 PHP
Laravel框架路由和控制器的绑定操作方法
2018/06/12 PHP
javascript游戏开发之《三国志曹操传》零部件开发(三)情景对话中仿打字机输出文字
2013/01/23 Javascript
javascript判断非数字的简单例子
2013/07/18 Javascript
js螺旋动画效果的具体实例
2013/11/15 Javascript
模拟一个类似百度google的模糊搜索下拉列表
2014/04/15 Javascript
jquery浏览器滚动加载技术实现方案
2014/06/03 Javascript
Javascript 多物体运动的实现
2014/12/24 Javascript
JavaScript DOM进阶方法
2015/04/13 Javascript
异步安全加载javascript文件的方法
2015/07/21 Javascript
Javascript之Math对象详解
2016/06/07 Javascript
基于jQuery代码实现圆形菜单展开收缩效果
2017/02/13 Javascript
使用grunt合并压缩js和css文件的方法
2017/03/02 Javascript
vue element项目引入icon图标的方法
2018/06/06 Javascript
vue.js+element-ui动态配置菜单的实例
2018/09/07 Javascript
react+redux仿微信聊天界面
2019/06/21 Javascript
vue elementUI使用tabs与导航栏联动
2019/06/21 Javascript
vue-cli3项目打包后自动化部署到服务器的方法
2020/09/16 Javascript
python实现xlsx文件分析详解
2018/01/02 Python
python numpy和list查询其中某个数的个数及定位方法
2018/06/27 Python
Python中栈、队列与优先级队列的实现方法
2019/06/30 Python
解决Python计算矩阵乘向量,矩阵乘实数的一些小错误
2019/08/26 Python
Python如何实现强制数据类型转换
2019/11/22 Python
Html5 页面适配iPhoneX(就是那么简单)
2019/09/05 HTML / CSS
OPPO手机官方商城:中国手机市场出货量第一品牌
2017/10/18 全球购物
以太网Ethernet IEEE802.3
2013/08/05 面试题
高中毕业自我鉴定
2013/12/16 职场文书
小学生作文评语
2014/04/18 职场文书
联谊活动总结
2014/08/28 职场文书
党性锻炼的心得体会
2014/09/03 职场文书
公务员党员评议表自我鉴定
2014/09/14 职场文书
2015年食堂工作总结报告
2015/04/23 职场文书
麦田里的守望者读书笔记
2015/06/30 职场文书
2016年习总书记讲话学习心得体会
2016/01/20 职场文书
python中的被动信息搜集
2021/04/29 Python