微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php下安装与使用protobuf

前言

上一周由于一个需求,需要使用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/PHPfpm 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

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐