|
简介:Google Protocol Buffer(简称Protobuf)是google公司内部的混合语言数据标准,目前已经正在使用的有超过48,162种报文格式定义和超过12183个.proto文件。他们用于RPC系统和持续数据存储系统。
Protocol Buffers是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。他很适合做数据存储或RPC数据交换格式。可用于通讯协议,数据存储等领域的语言无关、平台无关、可扩展的序列化结构格式
安装protobuf
进入网址:https://github.com/protocolbuffers/protobuf/releases/download/v3.9.1/protobuf-php-3.9.1.tar.gz
下载对应自己需要的安装包。进行安装
进入解压的安装包,执行一下命令
./configure
make & make install
export PATH = /usr/local/protobuf/bin:$PATH
protoc --version //查看是否安装成功
定义proto文件
例如:hello.proto
syntax = 'proto3';
package lm;
message helloworld{
int32 id = 1 ;
string str = 2;
int32 opt = 3
}
注意这里采用的是proto3的语法,和proto2不太一样,required和optional的限定已经没有了,所有字段都是可选的
编译生成php文件
使用上面安装成功的protobuf进行编译proto文件
protoc hello.proto --php-out=./
解释: --php_out :编译输出成php文件
--python_out : 编译输出成python文件
这时会在当前目录下,生成一个GPBMetadata的文件夹和LM的文件夹,此时查看lm文件夹下的helloword.php发现它 use了Google\Protobug下的类,这时一个php库,可以去下载
composer require google/protobuf
使用composer引入google/protobuf后,项目种会出现一个vendor目录。在自己的代码中include vendor下的autoload.php,以及刚才生成的helloword.php文件,就可以进行二进制的读写了。
测试二进制读写
写入二进制文件
include_once "vendor/autoload.php"; include_once "GPBMetadata/hello.php"; include_once "Lm/hellword.php";
$from = new \Lm\helloword(); $from->setId(1); $from->setOpt(29); $from->setStr("foo bar, this is a message"); $data = $from->serializeToString(); file_put_contents("data.ini",$data);
读取二进制文件
include_once "vendor/autoload.php"; include_once "GPBMetadata/hello.php"; include_once "Lm/helloword.php";
$data = file_get_contents("data.bin"); $to = new \Lm\helloword(); $to->mergeFromString($data); echo $to->getId().PHP_EOL; echo $to->getOpt().PHP_EOL; echo $to->getStr().PHP_EOL;
protobuf是什么,这么来的 简单来说就是干和xml一样的事,把某种数据结构的信息,以某种格式保存起来。主要用于数据存储、传输协议格式等场合。 专业的解答:protocol Buffers是一种轻便高效的结构化数据存储格式,可用于结构化数据串行化,很适合做数据存储或RPC数据交换格式。他可用于通讯协议、数据存储等领域的语言无关、平台无关 可扩展的序列化结构数据格式。
有了xml还搞protobuf原因: 根本原因还是:xml性能不好 1,时间维度:xml格式化(序列化)的开销倒还好;但是xml解析(反序列化)的开销就大了 2,空间维度:xml格式为了有较好的可读性,引入一些冗余的文本信息,所以空间开销也不是太好。
protobuf有什么好处? 1,对于数据结构的序列化反序列化等性能均优于xml 2,代码生成机制,使用起来十分方便 3,明星项目有使用:据了解google、新浪、美拍等均有用到protobuf,所以搬到项目肯定不会错
一,安装php的protobug扩展
wget https:
<?php /** * Auto generated from cbstest.proto */ namespace { /** * Person message */ class Person extends \ProtobufMessage { /* Field index constants */ const NAME = 1; const ID = 2; const EMAIL = 3; const MONEY = 4; /* @var array Field descriptors */ protected static $fields = array( self::NAME => array( 'name' => 'name', 'required' => true, 'type' => \ProtobufMessage::PB_TYPE_STRING, ), ...省略... }
这里会集成ProtobufMessage类,他是在protobuf.so种自动加载的 php实战的用法 对于俺这样非大神的人还是更关注实际的用法,如下
$foo = new Person(); $foo->setName("helloproto"); $foo->setId(2); $foo->setEmail('helloproto@mail.com'); $foo->setMoney(12323.763); $packed = $foo->serializeToString();
以上packed就是序列化后的结果,可直接存于数据库中
$p = new Person(); $p->parseFromString($packed); echo $p->getName(); echo $p->getEmail(); echo $p->getMoney(); echo $p->getId();
以上用于数据的反序列化。
来源:https://www.cnblogs.com/shangfz/p/11475810.html |