protobuffer php使用
protobuffer是google推出的一种数据传的方式,具体压缩,体积小的特点
protobuffer本身不支持php,若要把.proto文件转化为php支持的文件,需要使用第三方的程序
allegro/php-protobuf 或 drslump/Protobuf-PHP
参考 http://yueqian.sinaapp.com/a/52.html
http://hello1010.com/php-protobuf
一.下载并安装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使用的更多相关文章
- protobuffer序列化
一. 描述对象的proto文件 第一行package:对象经过protobuffer编译后形成java文件,这个文件放在按照package新建的文件夹内 java_package:java类的包名 j ...
- 为Cocos2d-x的Android平台加入Protobuffer支持
为Cocos2d-x的Android平台加入Protobuffer支持 分类: 工作2013-11-27 18:00 386人阅读 评论(1) 收藏 举报 cocos2d-xandroid平台交叉编译 ...
- Erlang使用ProtoBuffer
最近有工作需要打算为项目服务器做一个机器人,测试测试压力,根据自己的经验,使用Erlang来做是最合适不过的了,但是服务器使用的C++语言,使用了Google的ProtoBuffer作为协议进行数据交 ...
- 基于.NET CORE微服务框架 -surging 基于messagepack、protobuffer、json.net 性能对比
1.前言 surging内部使用的是高性能RPC远程服务调用,如果用json.net序列化肯定性能上达不到最优,所以后面扩展了protobuf,messagepack序列化组件,以支持RPC二进制传输 ...
- 【开源】AspnetCore 2.0 自动API文档生成组件,支持protobuffer
本文地址 http://www.cnblogs.com/likeli/p/8204054.html 关于 API文档自动生成,用于对APP端的开发帮助文档生成,默认ProtoBuffer传输格式. 本 ...
- 基于.NET CORE微服务框架 -谈谈surging 的messagepack、protobuffer、json.net 序列化
1.前言 surging内部使用的是高性能RPC远程服务调用,如果用json.net序列化肯定性能上达不到最优,所以后面扩展了protobuf,messagepack序列化组件,以支持RPC二进制传输 ...
- Python使用ProtoBuffer
Python使用ProtoBuffer Protocol Buffers,是Google公司开发的一种数据描述语言,类似于XML能够将结构化数据序列化,可用于数据存储.通信协议等方面. 就可读性而言感 ...
- Protobuffer简介c#
一.Protobuffer和json深度对比 JSON相信大家都知道是什么东西,如果不知道,那可就真的OUT了,GOOGLE一下去.这里就不介绍啥的了. Protobuffer大家估计就很少听说了,但 ...
- 编译gRPC Go版本使用的 ProtoBuffer 文件
本篇文章主要解决mac下安装ProtoBuffer,编译go版本gRPC用的.proto文件 安装 protoc 注意,gRPC 需要用到 proto3, 而目前 Release 的版本是 2.6.1 ...
随机推荐
- linux磁盘管理(RHEL)
IDE硬盘名称格式为/dev/hdXY,其中X为a-z的小写字母,Y为数字1-4(一块硬盘最多能分4个主分区).如hda1,表示第一块硬盘的第一个分区.hdb3表示第二块硬盘的第三个分区.还有如Pri ...
- 2018.09.27 codeforces618F. Double Knapsack(抽屉原理+构造)
传送门 思维题. 考虑维护两个数列的前缀和a1,a2,a3,...,ana_1,a_2,a_3,...,a_na1,a2,a3,...,an和b1,b2,b3,...,bnb_1,b_2,b_ ...
- 【转】MapReduce:详解Shuffle过程
——转自:{http://langyu.iteye.com/blog/992916} Shuffle过程是MapReduce的核心,也被称为奇迹发生的地方.要想理解MapReduce, Shuffle ...
- x11vnc配置--ubuntu14.04
x11vnc是连接到真实的X会话,相比vnc4server和tightvncserver自己创建不同分辨率的xserver来说,画面延时和显示效果应该要好一些.两种服务都试过,个人感觉x11vnc要好 ...
- MySQL性能调优与架构设计——第12章 可扩展设计的基本原则
第12章 可扩展设计的基本原则 前言: 随着信息量的飞速增加,硬件设备的发展已经慢慢的无法跟上应用系统对处理能力的要求了.此时,我们如何来解决系统对性能的要求?只有一个办法,那就是通过改造系统的架构体 ...
- gridview的编辑,更新,取消,自动分页等
gridview编辑列,把左下角的"自动生成字段"的复选框的勾去掉 添加boundfield(绑定列)将其datafield设置为productname,headertext设置为 ...
- JSP、Servlet中get请求和post请求的区别总结
在学习JavaWeb最初的开始阶段,大家都会遇到HttpServlet中的doGet和doPost方法.前两天看<Head First Servlets & JSP>看到其中讲关于 ...
- PO Release Final Closed 灾难恢复
今天不小心 Final Closed了一条Po Release,只能通过后台更新数据恢复了. 更新后可接收可匹配,但不保证更新数据有遗漏,慎用. 更新前备份各表数据 UPDATE PO_LINE_LO ...
- C++虚函数表(vtbl)
C++的虚函数的作用就是为了实现多态的机制,利用内存的指针偏移来实现将基类型的指针指向的内存空间用子类对象来初始化.这样经过内部虚表的运作,实现可以通过基类指针来调用子类所定义的方法. 这种技术,其实 ...
- C# 调用C++ CLR dll类库时,实现从 string 到 sbyte* 的转换
问题描述 今天在做项目的时候碰到一个问题,就是用C++编写CLR类库dll的时候,C++的函数参数列表中包含一个char*的输出型参数,然而在C#调用该dll时候,会自动将函数的中的char*参数“翻 ...