Protobuffer | PHP安装Google protobuf及使用

僤鯓⒐⒋嵵緔 提交于 2019-12-02 21:32:25

PHP安装Google protobuf及使用

备注

  1. 项目采用redis集群(主从方式)存储数据;数据量月增50W,单个数据序列化情况下达到2k,继续压缩数据解决空间.
  2. 项目服务采用PHP(版本5.3)作为RPC服务版本.
  3. protobuf的相关说明和指南请参考google proto buffers开发者指南

准备

安装protoc编译器

  1. 下载适合PHP 5.3版本的protobuf 2.5.0版本,下载地址
  2. 解压并安装

    tar -xvzf protobuf-2.5.0.tar.gz

    cd protobuf-2.5.0

    ./configure --prefix=指定安装路径

    make && make install

    我是安装在/usr/local/protobuf-2.5目录下的;

安装PHP protocolbuffers扩展

  1. 通过pecl扩展安装,扩展地址

    pecl install channel://pecl.php.net/protocolbuffers-0.2.6

  2. 通过源码编译, 下载地址

    tar -xvzf protocolbuffers-0.2.6.tar.gz

    cd protocolbuffers-0.2.6

    phpize

    ./configure

    make && make install

  3. 经过1或者2, 然后在你的php.ini配置文件中添加 : extension = "protocolbuffers.so"

  4. 获取ini位置和判断扩展是否安装成功,命令行执行如下命令 : 

    php -i | grep php.ini

    php -m | grep protocolbuffers

安装protoc plugin

  1. 按照protoc-gen-php的说明,用composer安装完成.

验证

  1. 通过composer安装过后,protoc-gen-php在 ~/.composer/vendor下面.

  2. 在~/.composer下创建demo.proto文件

    cd ~/.composer

    vim demo.proto

    复制如下内容到文件中 :

    syntax = "proto2";
    package Proto.Demo;
    message DemoPart1 {
        required string name = 1;
        required int32 age = 2;
        required string amount = 3;
    
    }
    
    message DemoPart2 {
        required int32 id = 1;
        required string address = 2;
    }

    说明:

    syntax :指定语法
    package :会生成对应的文件夹,并且以package的值生成namespace
    message :一个message会生成对应的一个文件,每个文件的名称就以message的名称生成,
    其他相关参考 : https://developers.google.com/protocol-buffers/
  3. 生成对应的protobuf压缩相关操作的PHP文件.

    运行命令:
    path_to_protobuf_installed/bin/protoc --plugin=vendor/bin/protoc-gen-php --php_out=path_to_project/Vendor demo.proto
    生成文件及对应目录
  4. 进行简单的相关操作

    新建文件demo.php,拷贝如下代码:

    $protoData = '';
    $age = 0;
    $part1 = null;
    
    $part1 = new \Proto\Demo\DemoPart1();
    $part1->setName('Jack Jones');
    $part1->setAge(20);
    $part1->setAmount('99.99');
    $protoData = $part1->serializeToString();
    // 运行得到压缩过后的字符串
    
    $part1 = \Proto\Demo\DemoPart1::parseFromString($protoData);
    $age = $part1->getAge();
    // 获取到$age的值
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!