如何在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 保留小数点
Apr 21 PHP
用php将任何格式视频转为flv的代码
Sep 03 PHP
php 获取select下拉列表框的值
May 08 PHP
javascript,php获取函数参数对象的代码
Feb 03 PHP
php生成缩略图示例代码分享(使用gd库实现)
Jan 20 PHP
使用PHP生成PDF方法详解
Jan 23 PHP
php实现的AES加密类定义与用法示例
Jan 29 PHP
详细解读php的命名空间(一)
Feb 21 PHP
Yii2 中实现单点登录的方法
Mar 09 PHP
PHP利用pdo_odbc实现连接数据库示例【基于ThinkPHP5.1搭建的项目】
May 13 PHP
php服务器的系统详解
Oct 12 PHP
PHP中类与对象功能、用法实例解读
Mar 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
php面向对象全攻略 (六)__set() __get() __isset() __unset()的用法
2009/09/30 PHP
php中get_headers函数的作用及用法的详细介绍
2013/04/27 PHP
解析PHP生成静态html文件的三种方法
2013/06/18 PHP
php使用curl获取https请求的方法
2015/02/11 PHP
yii2 resetful 授权验证详解
2017/05/18 PHP
PHP实现权限管理功能示例
2017/09/22 PHP
PHP面向对象类型约束用法分析
2019/06/12 PHP
[HTML/CSS/Javascript]WWTJS
2007/09/25 Javascript
JS date对象的减法处理实现代码
2010/12/28 Javascript
从零开始学习jQuery (十) jQueryUI常用功能实战
2011/02/23 Javascript
javascript中普通函数的使用介绍
2013/12/19 Javascript
Jquery通过ajax请求NodeJS返回json数据实例
2016/11/08 NodeJs
BootStrap 下拉菜单点击之后不会出现下拉菜单(下拉菜单不弹出)的解决方案
2016/12/14 Javascript
vuejs2.0运用原生js实现简单的拖拽元素功能示例
2017/02/24 Javascript
JavaScript通过改变文字透明度实现的文字闪烁效果实例
2017/04/27 Javascript
微信小程序 Buffer缓冲区的详解
2017/07/06 Javascript
vue中如何创建多个ueditor实例教程
2017/11/14 Javascript
为vue-router懒加载时下载js的过程中添加loading提示避免无响应问题
2018/04/03 Javascript
vue组件的写法汇总
2018/04/12 Javascript
Python实现随机选择元素功能
2017/09/14 Python
python奇偶行分开存储实现代码
2018/03/19 Python
redis数据库及与python交互用法简单示例
2019/11/01 Python
纯CSS3实现手风琴风格菜单具体步骤
2013/05/06 HTML / CSS
欧洲最大的笔和书写专家:The Pen Shop
2017/03/19 全球购物
施华洛世奇美国官网:SWAROVSKI美国
2018/02/08 全球购物
FORZIERI福喜利中国官网:奢侈品购物梦工厂
2019/05/03 全球购物
乌克兰数字设备、配件和智能技术的连锁商店:KTC
2020/08/18 全球购物
abstract class和interface有什么区别
2013/08/04 面试题
医学院校毕业生自荐信范文
2014/01/01 职场文书
感恩节红领巾广播稿
2014/02/11 职场文书
个人充满哲理的自我评价
2014/02/20 职场文书
城市规划应届毕业生自荐信
2014/07/04 职场文书
政治学专业毕业生求职信
2014/08/11 职场文书
2014年小学国庆节活动方案
2014/09/16 职场文书
毕业感言怎么写
2015/07/31 职场文书
利用Selenium添加cookie实现自动登录的示例代码(fofa)
2021/05/08 Python