一、php安装protobuf3
1.composer安装protobuf
composer require google/protobuf
2.下载protoc 编译器,用来将proto文件生成php文件
下载链接:https://github.com/protocolbuffers/protobuf/releases/download/v21.9/protoc-21.9-win64.zip
更多下载链接:https://github.com/protocolbuffers/protobuf/releases
下载解压后,把bin目录加入环境变量。
参考:
github:https://github.com/protocolbuffers/protobuf
官网参考文档:https://developers.google.com/protocol-buffers/docs/reference/php-generated?hl=zh-cn
二、简单使用
1.Messages
创建proto文件,person.proto文件
syntax = "proto3";
package test;
message Person {
string name = 1;
int32 id = 2;
string email = 3;
}
执行protoc --php_out=. person.proto生成php类。类的使用:
<?php
require_once 'vendor/autoload.php';
require_once 'Test/Person.php';
require_once 'GPBMetadata/Person.php';
$data=[
'name'=>'xdf',
'id'=>1,
'email'=>'dfjj@dfj.com',
];
$persion=new \Test\Person($data);
$res=$persion->serializeToString();
var_export($res);
$obj=new \Test\Person();
$obj->mergeFromString($res);
echo "\n";
var_export($obj->getName());
2 嵌套Messages
person.proto文件
syntax = "proto3";
package test;
message Person {
string name = 1;
int32 id = 2;
string email = 3;
info info_msg = 4;
message info{
string phone = 1;
string address = 2;
int32 age = 3;
}
}
再执行protoc --php_out=. person.proto重新生成php类。类的使用:
<?php
require_once 'vendor/autoload.php';
require_once 'Test/Person.php';
require_once 'Test/Person/info.php';
require_once 'GPBMetadata/Person.php';
$info=[
'phone'=>'123456',
'address'=>'xxxxxxx',
'age'=>25
];
$data=[
'name'=>'xdf',
'id'=>1,
'email'=>'dfjj@dfj.com',
'info_msg'=>new \Test\Person\info($info)
];
$persion=new \Test\Person($data);
$res=$persion->serializeToString();
var_export($res);
$obj=new \Test\Person();
$obj->mergeFromString($res);
echo "\n";
var_export($obj->getName());
echo "\n";
var_export($obj->getInfoMsg()->getPhone());
3.Repeated
序列化带未知长度列表的数据
person.proto文件
syntax = "proto3";
package test;
message Person {
string name = 1;
int32 id = 2;
string email = 3;
repeated info info_msg = 4;
message info{
string phone = 1;
string address = 2;
int32 age = 3;
}
}
再执行protoc --php_out=. person.proto重新生成php类。类的使用:
<?php
require_once 'vendor/autoload.php';
require_once 'Test/Person.php';
require_once 'Test/Person/info.php';
require_once 'GPBMetadata/Person.php';
$info=[
'phone'=>'123456',
'address'=>'xxxxxxx',
'age'=>25
];
$data=[
'name'=>'xdf',
'id'=>1,
'email'=>'dfjj@dfj.com',
'info_msg'=>[new \Test\Person\info($info),new \Test\Person\info($info)]
];
$persion=new \Test\Person($data);
$res=$persion->serializeToString();
var_export($res);
$obj=new \Test\Person();
$obj->mergeFromString($res);
echo "\n";
var_export($obj->getName());
echo "\n";
var_export($obj->getInfoMsg()->count());
var_export($obj->getInfoMsg()[0]->getAddress());
4.Maps
序列化带未知长度列表的数据
person.proto文件
syntax = "proto3";
package test;
message Person {
string name = 1;
int32 id = 2;
string email = 3;
map<string, string> more= 4;
}
再执行protoc --php_out=. person.proto重新生成php类。类的使用:
<?php
require_once 'vendor/autoload.php';
require_once 'Test/Person.php';
require_once 'GPBMetadata/Person.php';
$data=[
'name'=>'xdf',
'id'=>1,
'email'=>'dfjj@dfj.com',
'more'=>['qq'=>'123456','wx'=>'wx001','phone'=>'11111']
];
$person=new \Test\Person($data);
$res=$person->serializeToString();
echo $res;
$obj=new \Test\Person();
$obj->mergeFromString($res);
echo "\n";
$children=$obj->getMore();
三、在项目中使用protobuf3
首先按原api写好proto文件并生成php文件,然后在composer.json中引入文件所在目录并执行composer dumpautoload
例:
//响应的数据
$data=[
'id'=>1,
'name'=>'test',
'email'=>'test@test.com',
'info'=>[
'phone'=>12345678987,
'address'=>'xxxxxxx',
'age'=>66,
]
];
//当有message嵌套时,直接传入$data未能成功序列化,故只能先转json再转
$json=json_encode($data,320);
$obj=new Persion();
$obj->mergeFromJsonString($json);
return $obj->serializeToString();