`

PHP-Protobuf的编译

 
阅读更多

protobuf简介

Protocol Buffers 是一种轻便高效的结构化数据存储格式,可用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格式。它可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前只提供了 C++、Java、Python 三种语言的 API。

官方不支持PHP,不用担心,高手在民间。上Github搜索一下就有了。

安装protobuf

1
2
3
4
5
6
tar -jxvf protobuf-2.4.1.tar.bz2
cd protobuf-2.4.1/
./configure
make
make install

查看protobuf版本

1
protoc --version

编译php的protobuf扩展

在Google上搜索 protobuf php 可在github上找到两个与之相关的开源项目,它们是:allegro/php-protobuf 和drslump/Protobuf-PHP。在这里主要介绍allegro的编译方法(别问为什么,因为drslump的编译方法在我的电脑上不成功 -_- ||)。

下面介绍centos(CentOS Linux release 7.0.1406 (Core))环境中下载,编译:

1
2
3
unzip master.zip
cd php-protobuf-master

安装依赖

1
yum install php-devel

假如phpize不在默认目录,可以使用 which phpize查看,然后写全路径去执行phpize,我这里是默认在 /usr/bin目录,可以直接执行,执行之后可以看到以下输出

1
2
3
4
5
[root@VM_18_199_centos php-protobuf-master]# phpize
Configuring for:
PHP Api Version:         20100412
Zend Module Api No:      20100525
Zend Extension Api No:   220100525

php-config的目录也使用which php-config这个命令去查看路径,这一步需要安装gcc

1
yum -y install gcc-c++

安装完gcc之后则开始正式安装pb

1
2
3
./configure
make
make install

最后会看到类似这样的安装提示,则说明安装成功。

1
2
[root@VM_18_199_centos php-protobuf-master]# make install
Installing shared extensions:     /usr/lib64/php/modules/

现已成功把pb编译至/usr/lib64/php/modules/protobuf.so

开启php的pb扩展

找到php.in,加入这行代码:

1
extension=/usr/lib64/php/modules/protobuf.so

重启nginx

1
2
3
4
/usr/sbin/nginx -s reload
 
//重启php-fpm
kill -SIGUSR2 `cat /run/php-fpm/php-fpm.pid`

假如是Apache,则重启Apache

1
2
3
4
//centos 7.0
systemctl restart httpd
//centos 6.5
service httpd restart

编译proto文件

新建一个简单的proto文件:

1
vim test.proto

输入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
message PhoneNumber {
    required string number = 1;
    required int32 type = 2;
}
 
message Person {
    required string name = 1;
    required int32 id = 2;
    optional string email = 3;
    repeated PhoneNumber phone = 4;
    optional double money = 5;
}
 
message AddressBook {
  repeated Person person = 1;
}

编译。注意,这里需要引用到protoc-php.php这个文件,注意路径。

1
php ./php-protobuf-master/protoc-php.php  test.proto

编译成功后会在当前目录生成一个pbprototest.php文件,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/**
 * Auto generated from test.proto at 2015-10-22 23:19:46
 */
 
/**
 * PhoneNumber message
 */
class PhoneNumber extends \ProtobufMessage
{
    /* Field index constants */
    const NUMBER = 1;
    const TYPE = 2;
 
    /* @var array Field descriptors */
    protected static $fields = array(
        self::NUMBER => array(
            'name' => 'number',
            'required' => true,
            'type' => 7,
        ),
        self::TYPE => array(
            'name' => 'type',
            'required' => true,
            'type' => 5,
        ),
    );
 
    /**
     * Constructs new message container and clears its internal state
     *
     * @return null
     */
    public function __construct()
    {
        $this->reset();
    }
 
    .......
 
}

这里会继承ProtobufMessage类,它是在protobuf.so中自动加载的。 写一个测试类来测试一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php
require_once 'pb_proto_test.php';
 
$foo = new Person();
$foo->setName('hellojammy');
$foo->setId(2);
$foo->setEmail('helloxxx@foxmail.com');
$foo->setMoney(1988894.995);
 
$phone_num = new PhoneNumber();
$phone_num->setNumber('1351010xxxx');
$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');
}

运行

1
php text.php

可以看到输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
-----------src------------
hellojammy
1351010xxxx
Person {
  1: name => 'hellojammy'
  2: id => 2
  3: email => 'helloxxx@foxmail.com'
  4: phone(1) =>
    [0] =>
      PhoneNumber {
        1: number => '1351010xxxx'
        2: type => 3
      }
  5: money => 1988894.995
}
------------------------
 
 
------------parsed-------
hellojammy
helloxxx@foxmail.com
1988894.995
2
1351010xxxx
 
 
PS:转至http://hello1010.com/php-protobuf
分享到:
评论
1 楼 jerryzyyt 2016-05-24  
 

相关推荐

    protobuf编译好的文件

    protobuf编译好的文件通常指的是Google开源的Protocol Buffers(简称protobuf)编译后的二进制库、头文件和源代码,这些文件已经过编译,可以直接在开发项目中使用,以实现数据序列化和反序列化的高效通信。...

    PHP调用protobuf的rpc接口示例和说明

    本示例主要探讨如何在PHP中调用使用protobuf编译的RPC接口。 首先,了解protobuf的基本概念。protobuf是一种语言无关、平台无关的序列化框架,它可以将结构化的数据序列化为二进制流,以便在网络间传输或者存储到...

    tron-sdk:波场离线签名以及广播交易相关内容。整合波场相关API,内含trc20以及trx的查询转账离线签名以及广播交易等相关内容。整合部分波场的api

    idea 添加这个参数,解决tron-protobuf模块种的Protocol.java文件因为过大编译不成功/报错问题 方法一: Help -&gt; Edit Custom VM Options... 然后,新建一行添加,添加以下内容,然后重启idea即可生效 -Didea.max....

    protobuf 3.5.1

    protobuf-php-3.5.1.tar.gz protobuf-python-3.5.1.tar.gz protobuf-ruby-3.5.1.tar.gz protoc-3.5.1-linux-aarch_64.zip protoc-3.5.1-linux-x86_32.zip protoc-3.5.1-linux-x86_64.zip protoc-3.5.1-osx-x86_32....

    PHP安装protobuf详解

    在PHP中使用protobuf扩展,可以方便地对protobuf定义的`.proto`文件进行编译,生成PHP类,从而实现数据的序列化和反序列化。这对于跨语言的RPC通信以及数据存储非常有用。开发者可以定义自己的消息类型和服务接口,...

    php-protobuf

    在"php-protobuf"项目中,"Makefile"是一个重要的构建文件,通常用于自动化编译或安装过程。在Unix和Linux系统中,`make`命令会根据Makefile中的规则来构建、测试或安装项目。这表明该库可能包含用于编译PHP扩展或者...

    protobuf-all-3.19.4.tar.gz

    3. **头文件和源代码**:对于C++,这些文件用于编译protobuf库和应用程序。对于其他语言,可能包含生成的源代码。 4. **示例和测试**:为了帮助开发者理解和使用protobuf,包中可能包含示例代码和测试用例,展示...

    php protobuf

    Protobuf为PHP提供了支持,使得开发者可以编写能够理解Protobuf编译出的二进制数据的PHP代码。首先,我们需要定义服务和消息类型的.proto文件,这些文件使用Protobuf的语法描述了数据结构和服务接口。然后,使用...

    protobuf-php-3.14.0.tar.gz

    2. **编译protobuf**:使用protoc编译器将.proto文件转换为PHP类,以便在代码中使用。 3. **序列化和反序列化**:学习如何在PHP中将对象序列化为二进制数据,以及如何从二进制数据反序列化回对象。 4. **PHP API**:...

    abseil-cpp grpc编译基础库

    2. **Protocol Buffers(protobuf)**:protobuf是gRPC使用的接口定义语言,它允许开发者定义服务接口和数据结构。这些定义被编译成不同编程语言的代码,方便在服务端和客户端之间进行序列化和反序列化。 3. **gRPC...

    protobuf for windows php

    2. **代码生成**:使用protobuf编译器protoc将.proto文件编译成PHP类,这些类提供了序列化和反序列化的接口。 3. **数据交换**:了解如何在PHP中创建protobuf消息实例,设置字段值,然后将其序列化为字节流,反之...

    docker-protobuf:Jaeger项目的全面协议Docker映像

    一个轻量级protoc码头工人的形象,发布为jaegertracing/protobuf以,内置的所有依赖,产生多语言代码。 从分叉。 目的 原型文件中的gogoproto批注有助于使内部域模型类型在golang中更有效,但是使用这些原型文件...

    已经编译好的32位的各种语言版本的protobuf

    标题中的“已经编译好的32位的各种语言版本的protobuf”指的是Google的Protocol Buffers(protobuf)库,它已经预编译为适用于32位系统的不同编程语言版本。Protocol Buffers是一种序列化协议,用于结构化数据的高效...

    protobuf 2.6.1

    - 其他语言:protobuf还支持Go、PHP、Ruby等多门编程语言。 4. **编译器工具** - `protoc`:protobuf编译器,用于将.proto文件转换成目标语言的源码,如.h和.cc文件(C++),或者.java文件(Java)。 5. **...

    protobuf-all-3.15.8.zip

    3. 库文件:预编译的库文件,用于快速集成protobuf到项目中。 4. 示例和测试:包含示例数据和测试用例,帮助理解如何使用protobuf。 5. 文档:详细说明了protobuf的使用方法、API参考以及版本更新日志。 对于开发者...

    protobuf v3.2.0 的vs工程

    5. **php**:PHP语言的protobuf支持,包括解析器和编码器。 6. **m4**:m4宏文件,可能用于自动配置过程。 7. **objective-c**:Objective-C的protobuf库,用于iOS和macOS开发。 8. **editors**:可能包含集成到代码...

    protobuf3.6.1+grpc1.17 Windows 32版本编译好的文件

    grpc编译好的二进制Windows 32位的程序,开发的时候直接使用,不用再编译了,省去编译的烦恼。 protobuf 3.6.1版本 grpc 1.17版本 具体文件内容: grpc_php_plugin.exe check_epollexclusive.exe gen_hpack_tables....

    php7的sphinx扩展,适用linux,mac

    1. 检查系统中是否已安装libsphinxclient,如果没有,可以通过包管理器安装,如在Ubuntu上使用`sudo apt-get install libmysqlclient-dev libprotobuf-dev protobuf-compiler libcurl4-openssl-dev`。 2. 如果是版本...

    RPC调用框架比较分析

    - **protobuf-2.5.0.tar.bz2** 是一个压缩包,包含Protobuf库的源代码,版本为2.5.0,用于编译和生成对应语言的代码。 - **protobuf-rpc-readme.txt** 提供了关于Protobuf RPC的使用说明和指南。 - **protobuf-...

Global site tag (gtag.js) - Google Analytics