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/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

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值