zoukankan      html  css  js  c++  java
  • 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

    使用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 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 {
    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;
    }

    生成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------------
    ";
    echo $foo->getName() ."
    ";
    echo $foo->getPhone()[0]->getNumber() ."
    ";
    $foo->dump();
    echo "------------------------
    
    
    ";
    
    
    try {
          $p = new Person();
          $p->parseFromString($packed);
          echo "------------parsed-------
    ";
          echo $p->getName() ."
    ";
          echo $p->getEmail() ."
    ";
          echo $p->getMoney() ."
    ";
          echo $p->getId() . "
    ";
          echo $p->getPhone()[0]->getNumber() ."
    ";
    
          //$p->dump();
          echo "------------------------
    ";
          //print_r($xiao);
          } catch (Exception $ex) {
          die('Upss.. there is a bug in this example');
    }

    执行php文件 

    /usr/local/php5/bin/php example_2.php

  • 相关阅读:
    大厂面试高频Redis,记不住的多操作几次吧
    自动化测试系列之jenkins配置搭建环境
    关于linux服务器的磁盘监控的相关知识
    前端常见一些安全问题及解决方案
    如何使用PM2部署前端项目
    vuex状态管理器本地持久化
    关于在Vue中Typescript的写法
    websocket快速重连机制
    如何使用selenium打开多个浏览器
    运维人员踩坑记录之netplan遇坑,配置临时IP巧妙解决
  • 原文地址:https://www.cnblogs.com/taek/p/5470693.html
Copyright © 2011-2022 走看看