前言
上一周由于一个需求,需要使用protobuf协议进行交互,但是网上关于php使用protobuf协议与服务端交互的资料十分少,以及难找,因此记录一下。
ProtoBuf (Google Protocol Buffer)是由google公司设计的、用于数据交换的序列结构化数据格式,具有跨平台、跨语言、可扩展等特性,类似于常用的XML及JSON,但它具有更小的传输体积、更高的编码、解码能力,特别适合于数据存储、网络数据传输等对存储体积、实时性要求高的领域。
目前官方ProtoBuf 最新版本ProtoBuf3,已经支持多种语言:C++\C#\Go\Java\Python\Ruby\Object C \Javascript\PHP,并且提供工具很方便地根据不同语言产生ProtoBuf需要的类库。
一、环境准备
centos7 64位
PHP7.0.1
二、安装protobuf编译器
1)安装
本文使用的protobuf编译器版本为3.5.1。
官方发布地址: https://github.com/google/protobuf/releases/tag/v3.5.1 。
把压缩文件下载以后,进行解压并安装:
cd
mkdir downloads
cd downloads
sudo apt-get install autoconf automake libtool curl make g++ unzip
wget https://github.com/google/protobuf/releases/tag/v3.5.1
tar -zxvf protobuf-php-3.5.1.tar.gz
cd protobuf-3.5.1
./autogen.sh
./configure make make install
sudo ldconfig #refresh shared library cache.
2)校验
执行以上命令之后,执行下面的命令 查看是否安装成功,如果没报错,会显示protobuf的版本
protoc --version
三、安装php扩展
因为这次需要在PHP下使用protobuf,所以还需要安装protobuf在PHP下的扩展。
cd
cd downloads/protobuf-3.5.1/php/ext/google/protobuf
whereis phpize #找到phpize的具体路径,根据个人按照php时的路径不同而不同
/usr/local/php/bin/phpize
./configure && make && sudo make install
安装完以后,找到php.ini的目录,添加 protobuf 扩展。注意,需要根据个人的php安装时指定的php.ini的放置目录,不要照搬。
在php.ini中添加:
extension=protobuf.so
然后重启php:
/etc/init.d/php-fpm restart
输入以下命令校验是否安装并且配置成功:
php -m |grep protobuf
四、使用protobuf
1)首先为了让本次测试过程中,文件目录结构清晰一点,我们创建一个测试文件夹 test 和 编译后的类库文件夹 pb
cd
mkdir test
mkdir pb
2)进入 test 文件夹,创建一个简单的 proto 协议文件。使用 vim 编辑器创建并编辑hello.proto文件,并输入如下字符:
syntax = "proto3";
package test;
message helloworld
{
int32 id = 1; // ID
string str = 2; // str
int32 opt = 3; // optional field
}
3)编译协议文件:
protoc --proto_path=/root/test --php_out=/root/pb /root/test/hello.proto
4)这时会在 /root/pb 下,生成一个GPBMetadata的文件夹和Test的文件夹,如上图所示。
5)然后在 /pb 目录下,使用composer命令引入php的protobuf依赖类库:
composer require google/protobuf
采用composer方式引入google/protobuf之后,项目中会出现一个vendor目录。
6)继续在 /pb 目录下创建测试文件 testproto.php 。
<?php
include 'vendor/autoload.php';
include 'Test/helloworld.php';
include 'GPBMetadata/Hello.php'; #务必引入该文件,否则报错
$from = new \Test\helloworld();
$from->setId(9527);
$from->setStr('Hello world, this is my message');
$from->setOpt(27);
//生成protobuf二进制数据
$data = $from->serializeToString();
$to = new \Test\helloworld();
//解析数据
$to->mergeFromString($data);
echo $to->getId() . PHP_EOL;
echo $to->getStr() . PHP_EOL;
echo $to->getOpt() . PHP_EOL;
7)最后我们我们执行 testproto.php 脚本,可以看到可以正常解析出protobuf结构的数据。
参考链接:
https://www.jianshu.com/p/ce098058edf0
https://blog.csdn.net/supergao222/article/details/78566716?locationNum=3&fps=1
https://www.jianshu.com/p/ace5d1e83266
https://blog.csdn.net/xy2204/article/details/84883018
https://blog.csdn.net/panjiapengfly/article/details/82456642
https://www.cnblogs.com/ginkgo-leaf/p/9805854.html
https://www.jianshu.com/p/8f764bfd90da