前言
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 x=3;//性别}
1、syntax=”pr文章赏析oto3″:表明使用的是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
官方发布地址:
解压并安装:
tar -zxvf protobuf-php-3.5.1.tar.gzcd protobuf-3.5.1./configure --prefix=/opt/soft/protobufmakemake 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扩展包,这两者均可在刚才下载包里可以找到。
另外,也可以使用compor进行安装该依赖扩展:compor require google/protobuf
这里我主要是使用compor安装,应该它可以帮我产生autoload
安装好依赖后,我们就可以开始在php环境下使用protobuf了
1、序列化
<?phpinclude 'vendor/autoload.php';include 'gpbmetadata/person.php';include 'test/person.php';$person = new test\person();$person->tname("lailaiji");$person->tage("28");$person->tx(true);$data = $person->rializetostring();file_put_contents('data.bin',$d光棍节是几月几日ata);
2、反序列化
<?phpinclude 'vendor/autoload.php';include 'gpb函的格式metadata/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、rializetostring:序列化成二进制字符串
2、rializetojsonstring:序列化成json字符串
反序列化:
1、mergefromstring:二进制字符串反序列化
2、mergefromjsonstring:json字符串反序列化
.proto的m滦河essage解析
1、定义:
类型 变量名=位置;
如:int32 age=1;
这里需要区分,变量名后面的数字意义为该变量内容在二进制序列中的位置而不是变量的值,该数字必须是唯一不可重复使用。
2、目前支持的类型:
double,float,int32,int64,uint32 ,uint64,sint32,sint64
fixed32,fixed64,sfixed32,sfixed64,bool,bytes
性能测试
1、序列号+反序列号时间:
image.png
2、存储大小:
image.pn
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持www.887551.com。
本文发布于:2023-04-08 22:28:11,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/19aa383d8c44e4880dbc96a8a6a562b1.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:如何在PHP环境中使用ProtoBuf数据格式.doc
本文 PDF 下载地址:如何在PHP环境中使用ProtoBuf数据格式.pdf
留言与评论(共有 0 条评论) |