魏长东

weichangdong

东邪

protobuf实例-PHP

protobuf简介
protobuf是google提供的一个开源序列化框架,类似于XML,JSON这样的数据表示语言,其最大的特点是基于二进制,因此比传统的XML表示高效短小得多。虽然是二进制数据格式,但并没有因此变得复杂,开发人员通过按照一定的语法定义结构化的消息格式,然后送给命令行工具,工具将自动生成相关的类,可以支持php、java、c++、python等语言环境。通过将这些类包含在项目中,可以很轻松的调用相关方法来完成业务消息的序列化与反序列化工作。

protobuf在google中是一个比较核心的基础库,作为分布式运算涉及到大量的不同业务消息的传递,如何高效简洁的表示、操作这些业务消息在google这样的大规模应用中是至关重要的。而protobuf这样的库正好是在效率、数据大小、易用性之间取得了很好的平衡。

更多信息可参考官方文档
http://code.google.com/p/protobuf/

http://code.google.com/p/pb4php/(这是PHP类库)以下是具体操作例子

<?php
require_once('parser/pb_parser.php');
 $test = new PBParser(); 
$test->parse('./test.proto');
  
require_once('message/pb_message.php');
require_once('pb_proto_test.php');
$string = file_get_contents('./example/test.pb');
  
$book = new AddressBook();
$person = $book->add_person();
$person->set_name('Kordulla');
$person->set_surname('Nikolai');
  
$phone_number = $person->add_phone();
$phone_number->set_number('49');
$phone_number->set_type(Person_PhoneType::WORK);
  
$phone_number = $person->add_phone();
$phone_number->set_number('171');
$phone_number->set_type(Person_PhoneType::MOBILE);
  
// serialize
$string = $book->SerializeToString();
//echo $string;
// write it to disk
file_put_contents('adressbook.pb', $string);
$string = file_get_contents('./adressbook.pb');
// Just read it
$book = new AddressBook();
$book->parseFromString($string);
  
var_dump($book->person_size());
$person = $book->person(0);
var_dump($person->name());
var_dump($person->surname());
var_dump($person->phone(0)->number());
var_dump($person->phone(0)->type());
var_dump($person->phone(1)->number());
var_dump($person->phone(1)->type());

输出 

int(1) string(8) "Kordulla" string(7) "Nikolai" string(2) "49" int(2) string(3) "171" int(0) 
“adressbook.pb” 是生成的二进制文件 基本结构一个字节类型+ 字节长度 
从以上操作和类库源代码来看打包速度可能慢很多。

空间节省倒是非常好。

符合 protobuf 定义:效率、数据大小、易用性之间的平衡。