Mac系統下的PHP7 google protobuf

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
相關文章
相關標籤/搜索