protobuf初体验

1. 简介

protobuf是google 的一种数据交换的格式,它独立于语言,独立于平台。google 提供了三种语言的实现:java、c++ 和 python,每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式,比使用 xml 进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。

2. 下载

以linux环境为例 先安装protobuf

Google已经把protobuf的源码转移至github,并提供了autogen.sh进行部署,不过需要翻墙。也可以直接下载2.5.0版本的源码包编译安装。

3. 安装

下载完源码包后,进入下载目录

1
2
3
4
tar -xvzf protobuf-2.5.0.tar.gz
cd protobuf-2.5.0
./configure --prefix=/usr/local/protobuf
make && make install

查看安装状态

1
2
/usr/local/protobuf/bin/protoc --version
>>libprotoc 2.5.0

为了方便使用,编辑/etc/profile将bin目录加入系统环境变量

1
export PATH=$PATH:/usr/local/protobuf/bin

运行 source /etc/profile使设置生效

由于官方实现了java、c++ 和 python三种语言,所以对应语言可以直接使用protoc命令编译目标源

1
protoc -I=src_dir --cpp_out=dst_dir $src_dir/addressbook.proto

4. PHP下的使用需要安装protoc-gen-php插件

1
2
3
git clone https://github.com/drslump/Protobuf-PHP.git
cd Protobuf-PHP/
./protoc-gen-php.php --help

5. 编译

新建文件comment.proto

1
2
3
4
5
6
7
package protos;
message Comment {
  required uint64 id = 201;
  required string text = 202;
  optional uint64 created_at = 203;
}

由于protoc-gen-php预设了编译目录,所以编译时需要转移到编译目录(Protobuf-PHP/library/DrSlump/Protobuf/Compiler/protos)。也可以直接使用protoc命令自定义编译目录进行编译

1
2
3
4
5
protoc \
> --plugin=protoc-gen-php='/root/Protobuf-PHP/protoc-gen-php.php' \
> --proto_path='/root/Protobuf-PHP/' \
> --php_out=':./' \
> '/root/Protobuf-PHP/comment.proto'

编译完成后会在当前目录生成 comment.php

6. 测试

新建demo.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
include_once dirname(__FILE__).'/library/DrSlump/Protobuf.php';
\DrSlump\Protobuf::autoload();
include_once dirname(__FILE__).'/comment.php';
$comment = new protos\Comment;
$comment->setId(1);
$comment->setText('this is a test');
//use default codec
$data = $comment->serialize();
//use custom codec
$codec = new \DrSlump\Protobuf\Codec\Binary();
$data = $codec->encode($comment);
//decode
$comment_dec = new protos\Comment;
var_dump($codec->decode($comment_dec, $data));

发表评论

电子邮件地址不会被公开。 必填项已用*标注