如何在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 相关文章推荐
实现 win2003 下 mysql 数据库每天自动备份
Dec 06 PHP
PHP获取当前页面完整URL的实现代码
Jun 10 PHP
CI框架自动加载session出现报错的解决办法
Jun 17 PHP
主流PHP框架的优缺点对比分析
Dec 25 PHP
PHP实现返回JSON和XML的类分享
Jan 28 PHP
php实现有趣的人品测试程序实例
Jun 08 PHP
PHP.vs.JAVA
Apr 29 PHP
php查询及多条件查询
Feb 26 PHP
PHP基于新浪IP库获取IP详细地址的方法
May 04 PHP
PHP自动识别当前使用移动终端
May 21 PHP
php 与 nginx 的处理方式及nginx与php-fpm通信的两种方式
Sep 28 PHP
laravel 关联关系遍历数组的例子
Oct 10 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上传、管理照片示例
2006/10/09 PHP
一个基于PDO的数据库操作类
2011/03/24 PHP
ThinkPHP实现附件上传功能
2017/04/27 PHP
Avengerls vs Newbee BO3 第二场2.18
2021/03/10 DOTA
javascript arguments 传递给函数的隐含参数
2009/08/21 Javascript
jquery+css实现动感的图片切换效果
2015/11/25 Javascript
Angularjs在360兼容模式下取数据缓存问题的解决办法
2017/06/22 Javascript
JS随机数产生代码分享
2018/02/24 Javascript
JS实现字符串中去除指定子字符串方法分析
2018/05/17 Javascript
vue项目中使用lib-flexible解决移动端适配的问题解决
2018/08/23 Javascript
关于vue v-for循环解决img标签的src动态绑定问题
2018/09/18 Javascript
JavaScript错误处理操作实例详解
2019/01/04 Javascript
react实现antd线上主题动态切换功能
2019/08/12 Javascript
Vue数据双向绑定原理实例解析
2020/05/15 Javascript
jQuery实现简单弹幕制作
2020/12/10 jQuery
python爬虫之xpath的基本使用详解
2018/04/18 Python
Python OOP类中的几种函数或方法总结
2019/02/22 Python
python celery分布式任务队列的使用详解
2019/07/08 Python
解决tensorboard多个events文件显示紊乱的问题
2020/02/15 Python
Python流程控制语句的深入讲解
2020/06/15 Python
Python实现图片查找轮廓、多边形拟合、最小外接矩形代码
2020/07/14 Python
python3将变量输入的简单实例
2020/08/19 Python
python中Mako库实例用法
2020/12/31 Python
COACH德国官方网站:纽约现代奢侈品牌,1941年
2018/06/09 全球购物
Club Monaco加拿大官网:设计师男女服装
2019/09/29 全球购物
Nixon手表英国官网:美国尼克松手表品牌
2020/02/10 全球购物
JSF面试题:Jsf中的核心类用那些?有什么作用?LiftCycle六大生命周期是什么?
2014/07/17 面试题
咖啡店的创业计划书,让你hold不住
2014/01/03 职场文书
旅游业大学生创业计划书
2014/01/31 职场文书
阳光体育活动方案
2014/02/16 职场文书
2014新年元旦活动策划方案
2014/02/18 职场文书
群众路线教育实践活动心得体会
2014/03/07 职场文书
师德师风个人反思
2014/04/28 职场文书
班级出游活动计划书
2014/08/15 职场文书
开展党的群众路线教育实践活动工作总结
2014/11/05 职场文书
2015年先进个人自荐书
2015/03/24 职场文书