[TOC]
## 安装protoc编译器
> 根据xx.proto文件生成php类,需要用到protoc编译器 (一般开发环境可以安装,生产环境可以不用)
> Google's protoc compiler version 2.6 or above
~~~
wget https://github.com/google/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.gz
tar zxvf protobuf-2.6.1.tar.gz
cd protobuf-2.6.1/
./configure --prefix=/usr/local/protobuf
make && make install
export PATH=/usr/local/protobuf/bin:$PATH
protoc --version
~~~
## 安装php protobuf 扩展
> 下载地址 https://github.com/allegro/php-protobuf/archive/master.zip
~~~
phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make && make install
~~~
## php.ini 尾部中增加protobuf扩展
~~~
extension = protobuf.so
~~~
## 创建pb测试文件
> 文件名:test.proto
> 头部需指定是proto2还是proto3,有些第三方提供的是没有包含,需要显示指定
~~~
syntax = "proto2";
//syntax = "proto3";
package myapi;
// 字段都是用1,2,3这样的方式进行索引标识,等转换成PHP的类的时候,通过getXXFiled()的时候,则是根据这个索引标识进行获取
message Person {
required int32 id = 1;
required string name = 2;
optional string email = 3;
optional double money = 4;
optional bool is_rich = 5;
}
message player_login
{
optional int32 user_id = 1;
optional string token = 2;
};
~~~
## 生成pb对应的 PHP类文件
~~~
php ./php-protobuf-master/protoc-gen-php.php test.proto
~~~
## hyperf中引用生成类
> /config/container.php
~~~
//自动加载protobuf文件
foreach (glob(BASE_PATH . '/app/Protobuf/Myapi/*.php') as $proto_file) {
require_once($proto_file);
}
~~~
## TestController里进行测试
~~~
public function index()
{
$person = new Person();
$person->setName('www');
$person->setEmail('ww@qq.com');
$person->setId(11);
//$person->setMoney(123.2);
$packed = $person->serializeToString(); // 将对象序列化为字符串
var_dump($person);
var_dump($packed);
echo '--------parse---------'.PHP_EOL;
$p = new Person();
$p->parseFromString($packed); // 解析字符串转化为对象
var_dump($p);
}
~~~