前言
大家好,這是我在博客園的第一篇博文,很早之前就想嘗試開通技術博客了,但是由於各種原因計划一直都沒有實施。開通博客只是想簡單的記錄下自己生活工作相關的一些事情,之前一直在用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更多內容的以后再詳細介紹。
謝謝大家,有不對的地方希望大家多多指正