初識protobuf和php的相關用法


前言  

  大家好,這是我在博客園的第一篇博文,很早之前就想嘗試開通技術博客了,但是由於各種原因計划一直都沒有實施。開通博客只是想簡單的記錄下自己生活工作相關的一些事情,之前一直在用evernote記錄,無法用更多的人分享一些信息和交流,所以打算開通博客,將之前evernote上記錄的一些經歷分享出來和大家一起探討學習,初步定於每星期更新一篇博文,以后有時間可以能會增加更新的頻率,因為不經常寫,所以文采可以忽略,有錯誤的地方還望大家及時指正。廢話不多說,下面開始我的第一篇博文

 

正文

  本文主要介紹下php結合protobuf的一些相關用法,首先php相信大家都比較了解,它是一門主要用於web開發的解釋型高級面向對象的計算機編程語言,其全稱是超文本預處理器(Hypertext Preprocessor),現在的最新穩定版本是7.1。下面重點介紹下protobuf,protobuf是谷歌開源的一種用於數據交換的開源協議,其主要的特點是跨平台、跨語言、可擴展,它是一種用於序列化結構數據的開源協議。目前業界在擴平台、跨語言的領域數據交換用的最多的是使用json,但是相較於json,protobuf主要的特點表現為可擴展性強、安全性好、速度更快,下面我們就詳細看下php是怎么結合protobuf序列化結構數據的

  1、首先需要在開發機上面安裝protobuf,這里建議在github上克隆下來源碼編譯安裝,如要步驟如下:

    1)git clone https://github.com/protocolbuffers/protobuf.git

    進入到源碼目錄protobuf執行autogen.sh文件初始化安裝目錄(注:在執行的過程中有時候回報錯,無法執行,可能是因為automake沒有安裝,安裝完automake在執行一般就可以了)

    2)./authgen.sh

    初始化安裝目錄之后就可以看到,當前目錄下面有生成configure文件,接下來就是安裝linux下面標准的編譯安裝步驟執行就可以了

    3)./configure

    4)make

    5)make install

    執行完以上操作之后在本地就完成了protobuf的安裝,如果安裝成功可以執行protoc --version查看下當前安裝的版本

  2、接下來就要安裝php的protobuf的擴展

    1)執行以下命令獲取protobuf的php擴展源碼

      git clone https://github.com/allegro/php-protobuf.git

    2)獲取完源碼之后進入到php-protobuf目錄,按如下步驟安裝protobuf的php擴展

      cd php-protobuf

      phpize

      make

      make install

    3)執行完以上命令之后,在php的擴展目錄下會生成一個protobuf.so的動態鏈接庫文件,在php的配置文件中新增extension=protobuf.so的配置,通過php -m命令查看擴展是否有生效。

    4)最后在php-protobuf的目錄下面執行composer install安裝php-protobuf相關的依賴包

  3、完成了以上的准備工作之后,我們就可以開始正式的php+protobuf的開發工作了

    1)首先我們需要新增protobuf的文件,我們命名為foo.proto,內容如下:

syntax = "proto2";
message Foo
{
    required int32 bar = 1;
    optional string baz = 2;
    repeated float spam = 3;
}

      這里我們定義了一個簡單消息類型,其擁有三種數據類型

    2)接着我們要使用protoc工具將.proto的文件轉換成php的代碼,命令如下:

      php protoc-gen-php.php foo.proto

     執行完以上命令之后會在當前目錄下生成一個Foo.php的文件,這就是我們之前定義的Foo的php類文件,之后直接因為這個類文件我們就可以操作Foo類了

    3)最后我們新增一個testFoo.php的文件來使用Foo類,代碼如下:

require_once 'Foo.php';

$foo = new Foo();
$foo->setBar('string');
$foo->setBaz(1);
$foo->appendSpam(3.0);
$foo->appendSpam(4.0);

$packed = $foo->serializeToString();

$parsedFoo = new Foo();
$parsedFoo->clearSpam();
try {
    $parsedFoo->parseFromString($packed);
} catch (Exception $ex) {
    die('Oops.. there is a bug in this example, ' . $ex->getMessage());
}

$parsedFoo->dump();

    執行這個文件之后就會打印如下內容:

Foo {
  1: bar => 0
  2: baz => "1"
  3: spam(2) => 
    [0] => 3
    [1] => 4
}

    到此為止我們就完成了一個基本的php+protobuf的開發工作,關於protobuf更多內容的以后再詳細介紹。

    謝謝大家,有不對的地方希望大家多多指正

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM