Google の Protocol Buffer PHP実装メモ
どうも羊です。
前回で頑張るこ事リストで書いたGoogle の Protocol Buffer
今回、PHPでのHTTP通信を利用した実装をやってみたんでメモを残しておきます。
通常の Protocol Bufferの実装では、C++, Java, Python は対応していますが、
PHPは残念ながら対応していません。
検索すると、pb4php を発見、早速試す事に。
・ダウンロード
# cd /usr/local/src/
# wget http://pb4php.googlecode.com/files/protocolbuf_025.zip
・解凍
# tar zxvf protocolbuf_025.zip
・PEAR モジュールをコピー
# cp -R protocolbuf /{PEAR_DIR}/
インストール終了
早速サンプルを実行
まずデータ型を宣言を.protoに格納
test.proto
message Person
{
required string name = 1;
required int32 id = 2;
optional string email = 3;enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
// a simple comment
repeated PhoneNumber phone = 4;
}message AddressBook {
repeated Person person = 1;
}
.protoをPHPの読み取りソース出力
protoc.php
<?php
require_once(’protocolbuf/parser/pb_parser.php’);$test = new PBParser();
$test->parse(’./test.proto’);?>
送信側
test_send.php
<?php
require_once(’protocolbuf/message/pb_message.php’);//
require_once(’./pb_proto_test.php’);$book = new AddressBook();
$person = $book->add_person();
$person->set_name(’Nikolai’);
$person = $book->add_person();
$person->set_name(’Kordulla’);
$person->set_surname(’MySurname’);$phone_number = $person->add_phone();
$phone_number->set_number(’0711′);
$phone_number->set_type(Person_PhoneType::WORK);$phone_number = $person->add_phone();
$phone_number->set_number(’0171′);
$phone_number->set_type(Person_PhoneType::MOBILE);$phone_number = $person->add_phone();
$phone_number->set_number(’030′);// serialize
$string = $book->SerializeToString();print $string;
?>
受信側
test_recv.php
<?php
require_once(’protocolbuf/message/pb_message.php’);//
require_once(’./pb_proto_test.php’);$string = file_get_contents(’http://mydomain/test_send.php’);
$book = new AddressBook();
$book->parseFromString($string);var_dump($book->person_size());
$person = $book->person(0);
var_dump($person->name());
$person = $book->person(1);
var_dump($person->name());
var_dump($person->phone(0)->number());
var_dump($person->phone(0)->type());
var_dump($person->phone(1)->number());
var_dump($person->phone(1)->type());
var_dump($person->phone(2)->number());
var_dump($person->phone(2)->type());
?>
以上。
出力が確認できたらOK。かなり簡単