PHP環境中使用ProtoBuf資料格式

2020-07-16 10:05:57

前言

??RPC是google公司主導的一款RPC框架,並使用protobuf作為資料傳輸格式,伴隨gRPC框架的成熟及使用人群的增加,對於底層使用的資料格式protobuf也被越來越受到重視,而對於PHP生態而言,相關ProtoBuf介紹文件及使用資料比較少,故此寫簡文希望能幫助到一些有需要的同學。

??ProtoBuf (Google Protocol Buffer)是由google公司用於資料交換的序列結構化資料格式,具有跨平台、跨語言、可延伸特性,型別於常用的XML及JSON,但具有更小的傳輸體積、更高的編碼、解碼能力,特別適合於資料儲存、網路資料傳輸等對儲存體積、實時性要求高的領域。

??目前官方ProtoBuf 最新版本ProtoBuf3,已經支援多種語言:C++C#GoJavaPythonRubyObject C JavascriptPHP,並且提供工具很方便地根據不同語言產生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 TestPerson();
$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 TestPerson();
$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

推薦教學:《PHP


以上就是PHP環境中使用ProtoBuf資料格式的詳細內容,更多請關注TW511.COM其它相關文章!