如何在 PHP 中处理 Protocol Buffers 数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在 PHP 中处理 Protocol Buffers 数据相关的知识,希望对你有一定的参考价值。

第一步,安装Google的protoc编译器,这个工具可以把proto文件中定义的Message转换为各种编程语言中的类。下载release版本直接编译安装。
第二步,安装protoc的php plugin,需要使用composer安装,这个插件可以将proto文件转换到PHP文件,在PHP应用中引用后,可以将二进制格式的Protocol Buffers数据转换为PHP的对象。
第三步,安装php-protocolbuffers,这是一个PHP扩展,在第二步中已经完成了proto文件到PHP文件的转换,但是对PHP对象的各种操作还需要这个扩展中的API方法。
第四步,借助上面提到的扩展的各种API方法,可以简单地get出自己需要的字段完成后续工作
require "....../kingso.proto.php"
$ks_result = KSResult::parseFromString($kingso_res);
$ks_result->get('xxx_name');
参考技术A 第一步安装Googleprotoc编译器工具proto文件定义Message转换各种编程语言类载release版本直接编译安装
第二步安装protocPHP plugin需要使用composer安装插件proto文件转换PHP文件PHP应用引用二进制格式Protocol Buffers数据转换PHP象
第三步安装php-protocolbuffersPHP扩展第二步已经完proto文件PHP文件转换PHP象各种操作需要扩展API
第四步借助面提扩展各种API简单get自需要字段完续工作
require "....../kingso.proto.php"
$ks_result = KSResult::parseFromString($kingso_res);
$ks_result->get('xxx_name');本回答被提问者采纳

protocol_buff在windows下使用mingw32编译方法

最近接手的一个项目在消息上使用了protocol_buff(以下简称protobuf),是一个挺方便的消息结构体,之前没有接触过,便记录下在windows学习过程

protobuf的简介(转自百度百科)

 

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

protobuf的下载


protobuf源代码下载路径: http://code.google.com/p/protobuf/downloads/list (没FQ你能打开?反正我不翻打不开)
github上下载路径:https://github.com/google/protobuf

不小心下多了,把主干分支和release全下下来了,目前最新的版本是3.4.0

编译protobuf

了解过protobuf的同学们都知道protobuf使用之前要先进行编译生成protoc.exe,再用protoc.exe编译我们写的.proto类型的文件。

编译环境:win7 X64
编译器:mingw32
cmake:3.9.2
首先进入protobuf的文件中,这里我们用的protobuf版本是3.4.0版本,编译在tags/3.4.0/文件夹中进行
打开cmake-gui,
where is the source code复选框中填入3.4.0版本中的cmake文件夹(cmake文件使用的cmakelists.txt在这个文件夹中)
where to build the binaries复选框中填入cmake文件夹下的build文件夹(这个可以自己建一个build文件夹)
系统环境变量中请添加上cmake安装目录下的bin文件夹以及mingw安装目录下的bin文件夹。例如我当前的机器:D:\\programfiles\\cmake\\bin;C:\\MinGW\\bin
请确保你的mingw中含有mingw32-make.exe,如果没有的话,请在cmd中执行下面的命令:
mingw-get install gcc g++ mingw32-make

 


点击configure,配置选择默认的mingw makefile巴拉巴拉什么的。。。,等待cmake自动配置,配置完成图:

点击generate,生成makefile等文件

 


生成好makefile后,到github上下载gmock以及gtest,以下文件截取自cmake文件夹下的readme文件(此处也可跳过,在cmake中增加参数protobuf_BUILD_TESTS=OFF)

下载后在protobuf文件夹中建立gmock文件夹,将gmock中的代码等拷贝到其中,再在gmock文件夹中建立gtest文件夹,将gtest文件夹中的文件拷贝到其中,如下图:

打开cmd,切换到当前目录下,执行mingw32-make命令并等待make命令运行完毕

 

我这边在运行到73%。。。检查tests依赖的时候会报错。。。还没搞清楚为什么会报错,但是tests貌似我们不用?(我是这么觉得的)看了下文件,我们需要的protoc.exe已经生成了,就先不管它了。(后来又仔细看了下makefile,原来可以在cmake中添加参数-Dprotobuf_BUILD_TESTS=OFF来关闭测试,也就不需要再下载gmock和gtest了)

已经生成了protoc.exe

.proto文件的编译


将生成好的protoc.exe文件放到写好的.proto文件路径下,并打开命令行切换到该目录下
执行命令:protoc.exe -proto_path=SRC --cpp_out=DST SRC/test.proto
参数:SRC:proto文件所在文件夹 DST:生成目标文件夹 SRC/test.proto源文件名

 

将生成的*.pb.h,*.pb.cc文件放到项目文件夹下,项目头文件引用增加protobuf/src路径,链接文佳增加在build文件夹中生成的libprotobuf.a即可编译了

附一个测试用例:


#include <iostream>
#include "test.pb.h"
using namespace std;

int main()
{
GOOGLE_PROTOBUF_VERIFY_VERSION;
string send;
pblxtest::pblxtest test1;
pblxtest::pblxtest test2;
test1.set_name("testname");
test1.set_age(23);
cout << test1.IsInitialized() << endl;
test1.SerializeToString(&send);
cout << send << endl;
test2.ParseFromString(send);

cout << test2.name() << " " << test2.age() << endl;
return 0;
}

 

 

以上是关于如何在 PHP 中处理 Protocol Buffers 数据的主要内容,如果未能解决你的问题,请参考以下文章

protocol_buff在windows下使用mingw32编译方法

如何在 PHP 中处理 Protocol Buffers 数据

Google 的 Protocol Buffer 在实践中处理浮点类型的跨平台程度如何?

php 字典升序从小到大方法

如何使用 JAXL PHP 库 IQ Query Action Protocol XMPP

在 Objective-C (iphone) 中,如何管理“@protocol”引用的内存?