PHP7中Protobuf的安装使用

1,929 阅读3分钟

Protobuf简介

Google Protocol Buffer( 简称 Protobuf) 是一种更轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC数据交换格式。数据结构定义文件的格式如下:

syntax = "proto3";
package config;
message MailConfig{
string to = 1;
string from = 2;
string msg = 3;
}

然后这个协议文件客户端和服务端都需要用到。这样,网络发送字节就不需要发送和数据无关的字节了。针对上面的数据结构,序列化成json的长度是63,而按照Protobuf协议序列化之后的长度是41。如果数据更多,效果更明显。

Protobuf的安装使用

PHP和protoc的安装

要安装PHP版本的Protobuf,首先你得有PHP,所以首先安装PHP,还需要一个工具protoc

工具包版本下载地址

PHP	7.1.8	http://php.net/get/php-7.1.8.tar.gz/from/a/mirror
proto	3.0.0	https://github.com/google/protobuf/releases/download/v3.3.0/protobuf-php-3.3.0.zip

composer安装

composer require google/protobuf

Protobuf的简单例子

上面的步骤安装完之后,我们来看一下一个简单的例子,这个例子很简单,一个角色是Writer,一个角色是Reader。Writer向磁盘中写二进制字符串,Reader要读取二进制字符串中的信息。

书写 .proto 文件 我们知道,二进制序列如果没有协议,根本不知道它表示的是什么,首先我们需要编写一个 proto 文件,定义我们程序中需要处理的结构化数据,在 protobuf的术语中,结构化数据被称为 Message。我们这里定义一个mail的proto文件mail.proto,这个文件还是放在我们的app目录下, 文件内容如下:

syntax = "proto3";
package mail;
message MailConfig{
string to = 1;
string from = 2;
string msg = 3;
}

其中,syntax表示我们使用的是proto3语法规则。packge的名字叫做mail,然后定义了一个名字为MailConfig的消息。这个消息有3个成员,string类型的to,string类型的from,string类型的msg。

编译 .proto 文件 还记得我们下载安装的protoc工具吗,这个玩意就是拿来编译.proto文件的,它可以将.proto文件编译成很多种目标语言,java,python,php等。这里我们需要使用这个工具,将.proto文件生成目标PHP语言。

/usr/local/bin/protoc --php_out=. mail.proto --php-out表示生成目标语言存放位置,我们就放在当前目录下,也就是app文件夹下。如果生成目标语言成功,那么app文件夹下的目录如下:

composer.json composer.lock GPBMetadata Mail mail.proto vendor

编写测试

在app中编写test.php,文件内容如下:

<?php
require_once('vendor/autoload.php');
require_once('GPBMetadata/Mail.php');
require_once('Mail/MailConfig.php');
/**
* Writer写数据,Protobuf抽象成调用相关set函数即可
*/
$foo = new \Mail\MailConfig();
$foo->setTo("George");
$foo->setFrom("John");
$foo->setMsg("Don't forget the meeting!");
$packed = $foo->serializeToString();//这里你也可以选择serializeToJsonString序列化成JSON
//Reader读数据,Protobuf抽象成调用相关get函数即可
$res = new \Mail\MailConfig();
$res->mergeFromString($packed);
$jsonArr = [
"to"=> $res->getTo(),
"from"=> $res->getFrom(),
"msg"=> $res->getMsg(),
];
var_dump($jsonArr);

最终程序的输出:

[xxxx@controller app]# php test.php
array(3) {
["to"]=>
string(6) "George"
["from"]=>
string(4) "John"
["msg"]=>
string(25) "Don't forget the meeting!"
}

这就是一个典型的序列化和反序列化的例子,试想一下,如果我们将序列化好的二进制串通过网络发送到另一端,而另一端再使用同样的.proto文件生成的目标语言解析。这将变得比json更加的高效。因为我们可以传输更少的字节,反序列化速度也非常快。

原博链接 www.cnblogs.com/yifan72/p/9…