protobuffer是google推出的一种数据传的方式,具体压缩,体积小的特点

protobuffer本身不支持php,若要把.proto文件转化为php支持的文件,需要使用第三方的程序

allegro/php-protobuf 或 drslump/Protobuf-PHP

参考 http://yueqian.sinaapp.com/a/52.html

http://hello1010.com/php-protobuf

使用drslump/Protobuf-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 google\protobuf\DescriptorProto::clearExtension() should be compatible with DrSlump\Protobuf\Message::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 DrSlump\Protobuf\Message::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 DrSlump\Protobuf\Message::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 {
required string number = ;
required int32 type = ;
} message Person {
required string name = ;
required int32 id = ;
optional string email = ;
repeated PhoneNumber phone = ;
optional double money = ;
} message AddressBook {
repeated Person person = ;
}

生成proto对应的php文件

/usr/local/php5/bin/php  /home/source/aa/ab/cd/php-protobuf-master/protoc-php.php -t .  test2.proto

/usr/local/php/bin/php -c /usr/local/php/lib/php.ini  /home/source/php-7.0.2/ext/protobuf/protoc-php.php -t .  test_3.proto

vi example_2.php

<?php
require_once 'pb_proto_test2.php'; $foo = new Person();
$foo->setName('abc');
$foo->setId(1);
$foo->setEmail('abc');
$foo->setMoney(321321.32); $phone_num = new PhoneNumber();
$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 "------------------------\n\n\n"; try {
$p = new Person();
$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

protobuffer php使用的更多相关文章

  1. protobuffer序列化

    一. 描述对象的proto文件 第一行package:对象经过protobuffer编译后形成java文件,这个文件放在按照package新建的文件夹内 java_package:java类的包名 j ...

  2. 为Cocos2d-x的Android平台加入Protobuffer支持

    为Cocos2d-x的Android平台加入Protobuffer支持 分类: 工作2013-11-27 18:00 386人阅读 评论(1) 收藏 举报 cocos2d-xandroid平台交叉编译 ...

  3. Erlang使用ProtoBuffer

    最近有工作需要打算为项目服务器做一个机器人,测试测试压力,根据自己的经验,使用Erlang来做是最合适不过的了,但是服务器使用的C++语言,使用了Google的ProtoBuffer作为协议进行数据交 ...

  4. 基于.NET CORE微服务框架 -surging 基于messagepack、protobuffer、json.net 性能对比

    1.前言 surging内部使用的是高性能RPC远程服务调用,如果用json.net序列化肯定性能上达不到最优,所以后面扩展了protobuf,messagepack序列化组件,以支持RPC二进制传输 ...

  5. 【开源】AspnetCore 2.0 自动API文档生成组件,支持protobuffer

    本文地址 http://www.cnblogs.com/likeli/p/8204054.html 关于 API文档自动生成,用于对APP端的开发帮助文档生成,默认ProtoBuffer传输格式. 本 ...

  6. 基于.NET CORE微服务框架 -谈谈surging 的messagepack、protobuffer、json.net 序列化

    1.前言 surging内部使用的是高性能RPC远程服务调用,如果用json.net序列化肯定性能上达不到最优,所以后面扩展了protobuf,messagepack序列化组件,以支持RPC二进制传输 ...

  7. Python使用ProtoBuffer

    Python使用ProtoBuffer Protocol Buffers,是Google公司开发的一种数据描述语言,类似于XML能够将结构化数据序列化,可用于数据存储.通信协议等方面. 就可读性而言感 ...

  8. Protobuffer简介c#

    一.Protobuffer和json深度对比 JSON相信大家都知道是什么东西,如果不知道,那可就真的OUT了,GOOGLE一下去.这里就不介绍啥的了. Protobuffer大家估计就很少听说了,但 ...

  9. 编译gRPC Go版本使用的 ProtoBuffer 文件

    本篇文章主要解决mac下安装ProtoBuffer,编译go版本gRPC用的.proto文件 安装 protoc 注意,gRPC 需要用到 proto3, 而目前 Release 的版本是 2.6.1 ...

随机推荐

  1. 编译 link

    --generating dsym file change the appropriate one from 'DWARF with dSYM file' to just 'DWARF',This s ...

  2. 冒泡排序java语言实现

    class bubbleSort { public static void main(String[] args){ int[] a={49,38,65,97,76,13,27,49,78,34,12 ...

  3. 2018.07.28 uoj#169. 【UR #11】元旦老人与数列(线段树)

    传送门 线段树好题. 维护区间加,区间取最大值,维护区间最小值,历史区间最小值. 同样先考虑不用维护历史区间最小值的情况,这个可以参考这道题的解法,维护区间最小和次小值可以解决前两个操作,然后使用历史 ...

  4. int最大值+1为什么是-2147483648最小值-1为什么是2147483647

    今天一个新手学编程就问到这个问题,很多人第一次学编程肯定会遇到这个问题,大部分都知道是溢出之类的,用源码和补码就很容易说明 int i = -2147483648 ;这是不允许的 VS里报的错 err ...

  5. 记一次web服务模块开发过程

    一.前言 之前在分析WCS系统的过程中,也赶上要开发其中的一个模块,用于和AGV系统对接完成一些取货.配盘等任务:在这里将这次模块开发的全过程记录一下,以便自己以后开发时能够更加快速的明白流程. 二. ...

  6. lpm_clshift ip仿真

    今天仿真了一下lpm_clshift ip 其中din为输入的信号,sh_out为输出的信号. 以上为IP的设置. 可以看到din 的00000010 对应的step的2,一个时钟后sh_out的输出 ...

  7. 20155218 2016-2017-2 《Java程序设计》第10周学习总结

    20155218 2016-2017-2 <Java程序设计>第10周学习总结 教材学习内容总结 一个IP地址可以对应多个域名,一个域名只能对应一个IP地址. 在网络通讯中,第一次主动发起 ...

  8. webUploader上传视频,包括上传进度、上传状态、暂停和取消等

    踩坑视频上传: 点击开始上传: 头部引入webuploader.css <!DOCTYPE html> <html lang="en"> <head& ...

  9. 可视化iOS应用程序开发的6个Xcode小技巧

    FIXME 该标签用来提醒你代码中存在稍后某个时间需要修改的部分.(编辑注:网络上有一些可以用来收集项目中`TODO`和`FIXME`标签的辅助插件,比如XToDo https://github.co ...

  10. 20155302 2016-2017-2 《Java程序设计》第六周学习总结

    20155302 2016-2017-2 <Java程序设计>第6周学习总结 教材学习内容总结 Java中的流分为两种,一种是字节流,另一种是字符流,分别由四个抽象类来表示(每种流包括输入 ...