概述
protobuffer是google推出的一种数据传的方式,具体压缩,体积小的特点
protobuffer本身不支持php,若要把.proto文件转化为php支持的文件,需要使用第三方的程序
一.下载并安装protoc编译器
tar -xzf protobuf-2.4.1.tar.gz && cd protobuf-2.4.1
cd protobuf-2.1.0
./configure --prefix=/usr/local/proto
make
make check
make install
二.下载并安装protoc对应的php扩展
https://github.com/chobie/php-protocolbuffers
wget --no-check-certificate https://github.com/chobie/php-protocolbuffers/archive/master.zip
unzip master && cd php-protocolbuffers-master/
/usr/local/php5/bin/phpize
./configure --with-php-config=/usr/local/php5/bin/php-config
make && make install
重启php
kill -USR2 `cat /usr/local/php5/var/run/php-fpm.pid`
生成的.so文件是protocolbuffers.so
allegro/php-protobuf 本身就带扩展,同时支持将.proto文件转为php文件
生成的.so文件是protobuf.so
三.下载 drslump/Protobuf-PHP 得到protoc-gen-php插件
并执行
/usr/local/php5/bin/pear channel-discover pear.pollinimini.net
/usr/local/php5/bin/pear install drslump/Protobuf-beta
四.将.proto文件转为php文件
/usr/local/proto/bin/protoc --plugin=protoc-gen-php=‘/home/source/Protobuf-PHP-master/protoc-gen-php.php‘ --proto_path=‘/home/source/Protobuf-PHP-master‘ --php_out=‘:./‘ ‘/home/source/Protobuf-PHP-master/test.proto‘
执行后报错
PHP Warning: Declaration of googleprotobufDescriptorProto::clearExtension() should be compatible with DrSlumpProtobufMessage::clearExtension($extname) in /home/source/Protobuf-PHP-master/library/DrSlump/Protobuf/Compiler/protos/descriptor.pb.php on line 688
--php_out: protoc-gen-php: Plugin output is unparseable.
类中的方法重复了,注释掉它就行
PHP Warning: Missing argument 1 for DrSlumpProtobufMessage::hasExtension(), called in /home/source/Protobuf-PHP-master/library/DrSlump/Protobuf/Compiler/PhpGenerator.php on line 280 and defined in /home/source/Protobuf-PHP-master/library/DrSlump/Protobuf/Message.php on line 283
PHP Notice: Undefined variable: extname in /home/source/Protobuf-PHP-master/library/DrSlump/Protobuf/Message.php on line 285
PHP Warning: Missing argument 1 for DrSlumpProtobufMessage::hasExtension(), called in /home/source/Protobuf-PHP-master/library/DrSlump/Protobuf/Compiler/PhpGenerator.php on line 87 and defined in /home/source/Protobuf-PHP-master/library/DrSlump/Protobuf/Message.php on line 283
PHP Notice: Undefined variable: extname in /home/source/Protobuf-PHP-master/library/DrSlump/Protobuf/Message.php on line 285
--php_out: protoc-gen-php: Plugin output is unparseable.
library/DrSlump/Protobuf/Compiler/PhpGenerator.php
87行
if ($proto->hasExtension()) {
改为
if ($proto->hasExtension(null)) {
280行
if ($msg->hasExtension()) {
改为
if ($msg->hasExtension(null)) {
vi /home/source/Protobuf-PHP-master/library/DrSlump/Protobuf/Compiler/Cli.php
第二行添加
set_include_path(‘.:/usr/local/php5/share/pear/‘);
可执行文件了
使用allegro/php-protobuf 貌似这是个protoc的php客户端
wget https://github.com/allegro/php-protobuf/archive/master.zip
unzip master.zip && cd php-protobuf-master
/usr/local/php5/bin/phpize
./configure --with-php-config=/usr/local/php5/bin/php-config
make && make install
重启php
kill -USR2 `cat /usr/local/php5/var/run/php-fpm.pid`
使用方法
/usr/local/php5/bin/php /home/source/aa/ab/cd/php-protobuf-master/protoc-php.php -t . test2.proto
注意一定要加上 -t 表示输入文件的路径,不然没有文件被输出
例子:
vi test2.proto
message PhoneNumber {
requiredstring number = 1;
required int32 type= 2;
}
message Person {
requiredstring name = 1;
required int32 id= 2;
optionalstring email = 3;
repeated PhoneNumber phone= 4;
optionaldouble money = 5;
}
message AddressBook {
repeated Person person= 1;
}
生成proto对应的php文件
/usr/local/php5/bin/php /home/source/aa/ab/cd/php-protobuf-master/protoc-php.php -t . test2.proto
vi example_2.php
<?phprequire_once ‘pb_proto_test2.php‘;$foo = newPerson();$foo->setName(‘abc‘);$foo->setId(1);$foo->setEmail(‘abc‘);$foo->setMoney(321321.32);$phone_num = newPhoneNumber();$phone_num->setNumber(‘16589875625‘);$phone_num->setType(3);$foo->appendPhone($phone_num);//$foo->appendPhone(2);
$packed = $foo->serializeToString();//echo $packed;exit;#$foo->clear();
echo "-----------src------------n";echo $foo->getName() ."n";echo $foo->getPhone()[0]->getNumber() ."n";$foo->dump();echo "------------------------nnn";try{$p = newPerson();$p->parseFromString($packed);echo "------------parsed-------n";echo $p->getName() ."n";echo $p->getEmail() ."n";echo $p->getMoney() ."n";echo $p->getId() . "n";echo $p->getPhone()[0]->getNumber() ."n";//$p->dump();
echo "------------------------n";//print_r($xiao);
} catch (Exception $ex) {die(‘Upss.. there is a bug in this example‘);
}
执行php文件
/usr/local/php5/bin/php example_2.php
原文:http://www.cnblogs.com/taek/p/5470693.html
最后
以上就是孤独仙人掌为你收集整理的protobuffer php,protobuffer php使用的全部内容,希望文章能够帮你解决protobuffer php,protobuffer php使用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复