PHP7要使用Google protobuf有兩步驟:Protocol Compiler Installation和Protobuf Runtime Installation
1、Protocol Compiler Installation
一、下載:https://github.com/google/pro...
二、解壓:/Users/User/Downloads/protoc-3.2.0-osx-x86_64/bin/protoc
2、Protobuf Runtime Installation
一、找到PHP對應的package:
https://github.com/google/pro...
下載,至關於給框架添加一個依賴包:composer require "google/protobuf"
php
二、在框架目錄裏生成PHP文件:
--plugin=vendor/google/protobuf/php/generate_descriptor_protos.sh:protobuf對應的php擴展插件git
--php_out=src/ :生成protobuf對應php文件的目錄github
src/demo.proto :框架目錄下定義的.proto文件api
demo.proto:app
syntax = "proto3"; message SearchRequest { string query = 1; int32 page_number = 2; int32 result_per_page = 3; }
執行命令,生成php文件:composer
/Users/User/Downloads/protoc-3.2.0-osx-x86_64/bin/protoc --plugin=vendor/google/protobuf/php/generate_descriptor_protos.sh --php_out=src/ src/demo.proto
或者框架
/Users/User/Downloads/protoc-3.2.0-osx-x86_64/bin/protoc --proto_path=myProto/ --php_out=app/Http/Controllers/ myProto/demo.proto
三、使用protobuf
生成SearchRequest.php文件後,在框架的控制器裏引用,經測試,放在Controllers目錄之外,會致使引用錯誤,最終選擇在Controllers目錄下生成proto文件測試
<?php namespace App\Http\Controllers; require_once "SearchRequest.php"; class ExampleController extends Controller { /** * Create a new controller instance. * * @return void */ public function __construct(){} public function setData() { $part1 = null; $part1 = new \SearchRequest(); $part1->setQuery('6'); $part1->setPageNumber(66); $part1->setResultPerPage(666); $protoData = $part1->serializeToString(); return $protoData; } public function getData() { $protoData = file_get_contents("http://api.xxx.com/setData"); try { //運行獲得壓縮事後的字符串 $part2 = new \SearchRequest(); $part2->mergeFromString($protoData); $part2->setQuery("okaaa"); return $part2->serializeToString(); // 獲取到$age的值 } catch (Exception $ex) { die('Upss.. there is a bug in this example'); } } }
SearchRequest.php,有一處GPBMetadataDemo::initOnce()須要修改命名空間:ui
<?php # Generated by the protocol buffer compiler. DO NOT EDIT! # source: demo.proto use Google\Protobuf\Internal\GPBType; use Google\Protobuf\Internal\RepeatedField; use Google\Protobuf\Internal\GPBUtil; /** * Protobuf type <code>SearchRequest</code> */ class SearchRequest extends \Google\Protobuf\Internal\Message { /** * <code>string query = 1;</code> */ private $query = ''; /** * <code>int32 page_number = 2;</code> */ private $page_number = 0; /** * <code>int32 result_per_page = 3;</code> */ private $result_per_page = 0; public function __construct() { //\GPBMetadata\Demo::initOnce();//原始代碼 \App\Http\Controllers\GPBMetadata\Demo::initOnce();//修改命名空間 parent::__construct(); } /** * <code>string query = 1;</code> */ public function getQuery() { return $this->query; } /** * <code>string query = 1;</code> */ public function setQuery($var) { GPBUtil::checkString($var, True); $this->query = $var; } /** * <code>int32 page_number = 2;</code> */ public function getPageNumber() { return $this->page_number; } /** * <code>int32 page_number = 2;</code> */ public function setPageNumber($var) { GPBUtil::checkInt32($var); $this->page_number = $var; } /** * <code>int32 result_per_page = 3;</code> */ public function getResultPerPage() { return $this->result_per_page; } /** * <code>int32 result_per_page = 3;</code> */ public function setResultPerPage($var) { GPBUtil::checkInt32($var); $this->result_per_page = $var; } }
Demo.php,修改命名空間:this
<?php # Generated by the protocol buffer compiler. DO NOT EDIT! # source: demo.proto //namespace GPBMetadata;//原始命名空間 namespace App\Http\Controllers\GPBMetadata;//修改後的命名空間 class Demo { public static $is_initialized = false; public static function initOnce() { $pool = \Google\Protobuf\Internal\DescriptorPool::getGeneratedPool(); if (static::$is_initialized == true) { return; } $pool->internalAddGeneratedFile(hex2bin( "0a620a0a64656d6f2e70726f746f224c0a0d536561726368526571756573" . "74120d0a05717565727918012001280912130a0b706167655f6e756d6265" . "7218022001280512170a0f726573756c745f7065725f7061676518032001" . "2805620670726f746f33" )); static::$is_initialized = true; } }
備註:若是執行命令出現錯誤,可到vendor/google/protobuf目錄下執行:
./autogen.sh ./configure ./generate_descriptor_proto.sh