Protobuffer | PHP安裝Google protobuf及使用

PHP安裝Google protobuf及使用

備註

  1. 項目採用redis集羣(主從方式)存儲數據;數據量月增50W,單個數據序列化狀況下達到2k,繼續壓縮數據解決空間.
  2. 項目服務採用PHP(版本5.3)做爲RPC服務版本.
  3. protobuf的相關說明和指南請參考google proto buffers開發者指南

準備

安裝protoc編譯器

  1. 下載適合PHP 5.3版本的protobuf 2.5.0版本,下載地址
  2. 解壓並安裝php

    tar -xvzf protobuf-2.5.0.tar.gzgit

    cd protobuf-2.5.0github

    ./configure --prefix=指定安裝路徑redis

    make && make installvim

    我是安裝在/usr/local/protobuf-2.5目錄下的;composer

安裝PHP protocolbuffers擴展

  1. 經過pecl擴展安裝,擴展地址ui

    pecl install channel://pecl.php.net/protocolbuffers-0.2.6google

  2. 經過源碼編譯, 下載地址spa

    tar -xvzf protocolbuffers-0.2.6.tar.gz.net

    cd protocolbuffers-0.2.6

    phpize

    ./configure

    make && make install

  3. 通過1或者2, 而後在你的php.ini配置文件中添加 : extension = "protocolbuffers.so"

  4. 獲取ini位置和判斷擴展是否安裝成功,命令行執行以下命令 : 

    php -i | grep php.ini

    php -m | grep protocolbuffers

安裝protoc plugin

  1. 按照protoc-gen-php的說明,用composer安裝完成.

驗證

  1. 經過composer安裝事後,protoc-gen-php在 ~/.composer/vendor下面.

  2. 在~/.composer下建立demo.proto文件

    cd ~/.composer

    vim demo.proto

    複製以下內容到文件中 :

    syntax = "proto2";
    package Proto.Demo;
    message DemoPart1 {
        required string name = 1;
        required int32 age = 2;
        required string amount = 3;
    
    }
    
    message DemoPart2 {
        required int32 id = 1;
        required string address = 2;
    }

    說明:

    syntax :指定語法
    package :會生成對應的文件夾,而且以package的值生成namespace
    message :一個message會生成對應的一個文件,每一個文件的名稱就以message的名稱生成,
    其餘相關參考 : https://developers.google.com/protocol-buffers/
  3. 生成對應的protobuf壓縮相關操做的PHP文件.

    運行命令:
    path_to_protobuf_installed/bin/protoc --plugin=vendor/bin/protoc-gen-php --php_out=path_to_project/Vendor demo.proto
    生成文件及對應目錄
  4. 進行簡單的相關操做

    新建文件demo.php,拷貝以下代碼:

    $protoData = '';
    $age = 0;
    $part1 = null;
    
    $part1 = new \Proto\Demo\DemoPart1();
    $part1->setName('Jack Jones');
    $part1->setAge(20);
    $part1->setAmount('99.99');
    $protoData = $part1->serializeToString();
    // 運行獲得壓縮事後的字符串
    
    $part1 = \Proto\Demo\DemoPart1::parseFromString($protoData);
    $age = $part1->getAge();
    // 獲取到$age的值
相關文章
相關標籤/搜索