ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
[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); } ~~~