PHP Protobuffer

作者: JunChow520 | 来源:发表于2019-03-16 20:24 被阅读0次

    Protocol Buffers(简称protobuf)是一种轻便高效的结构化数据存储格式,可用于结构化数据的串行化,适合做数据存储或RPC数据交换格式。可用于通讯协议、数据存储等领域的与语言无关、平台无关、可扩展的序列化结构数据格式。

    Protocol Buffers是Google定义的一种跨语言、跨平台、可扩展的数据传输及存储的协议,因为将字段协议分别放在传输两端,传输数据中只包含数据本身,无需包含字段说明,所以传输数据量小,解析效率高。

    • 对于数据结构的序列化反序列化等性能均优化于XML
    • 代码生成机制,使用起来十分方便。

    安装使用

    $ cat /etc/redhat-release
    CentOS Linux release 7.6.1810 (Core) 
    
    $ php -v
    
    $ php-fpm -v
    PHP 7.2.6 (fpm-fcgi) (built: Feb 13 2019 20:01:31)
    Copyright (c) 1997-2018 The PHP Group
    Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    

    若系统中原来已经安装php,重新安装后会同时存在两个不同版本的php。

    # 查找php.ini配置文件
    $ find / -name php.ini
    /etc/php.ini
    /usr/local/php/etc/php.ini
    
    # 查看php加载的是那个配置
    $ php -ir | grep php.ini
    Configuration File (php.ini) Path => /usr/local/php/etc
    Loaded Configuration File => /usr/local/php/etc/php.ini
    
    # 查看系统中php相关目录
    $ find / -name php
    
    # 查看系统默认php版本
    $ /usr/bin/php -v
    
    # 去掉系统默认版本可以直接删除/usr/bin/目录下所有php文件,建议备份下。
    $ cd /usr/bin && make bak
    $ mv php bak/
    ...
    
    # 在环境变量中添加php命令目录
    $ vim /etc/profile
    export PATH="/usr/local/php/bin:$PATH"
    $ source /etc/profile
    
    $ php -v
    PHP 7.2.6 (cli) (built: Feb 13 2019 20:01:18) ( NTS )
    Copyright (c) 1997-2018 The PHP Group
    Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    

    编译安装protoc编译器

    • protoc可将proto文件中定义的Message转换为各种变成语言中的类。
    • 注意使用protobuf是需要双方大版本保持一致,这里用protobuf2的版本。
    # 下载安装包
    $ wget https://github.com/google/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.gz
    
    # 解压安装包
    $ tar -zxvf protobuf-2.6.1.tar.gz && cd protobuf-2.6.1
    
    # 初始化配置
    $ ./configure --prefix=/usr/local/protobuf
    
    # 若configure添加了--prefix选择则可以不设置
    # $ ./configure
    # $ export PATH=/usr/local/protobuf/bin:$PATH
    
    # 编译安装
    $ make && make install
    
    # 查看版本
    $ protoc --version
    libprotoc 2.6.1
    

    问题:protoc: error while loading shared libraries: libprotoc.so.9: cannot open shared object file: No such file or directory

    $ export LD_LIBRARY_PATH=/usr/local/lib
    
    $ protoc --version
    libprotoc 2.6.1
    

    问题:编译安装php-protocolbuffers

    $ git clone https://github.com/chobie/php-protocolbuffers.git
    $ cd php-protocolbuffers
    $ phpize
    $ ./configure --with-php-config=/usr/local/php/bin/php-config
    $ make && make check
    fatal error: ext/standard/php_smart_str.h: No such file or directory
    

    失败,算了,不折腾,后面是坑!错误原因是php_smart_str.h在php7中名字修改为php_smart_string.h

    编译安装PHP的protobuf扩展:allegro/php-protobuf

    # 下载解压
    $ wget https://github.com/allegro/php-protobuf/archive/master.zip
    $ unzip master.zip
    $ cd php-protobuf-master
    
    # 安装依赖
    $ yum install php-devel
    
    # 使用phpsize安装扩展模块
    $ which phpize
    /usr/local/php/bin/phpize
    
    $ which php-config
    /usr/local/php/bin/php-config
    
    $ phpize
    $ ./configure --with-php-config=/usr/local/php/bin/php-config
    
    # 编译安装
    $ make && make check
    $ make && make install
    
    # 安装成功后会在当前目录的module文件夹下会生成protobuf.so扩展文件
    $ cd modules && ls
    protobuf.so
    
    # 查看php配置文件路径
    $ php --ini|grep php.ini
    Configuration File (php.ini) Path: /usr/local/php/etc
    Loaded Configuration File:         /usr/local/php/etc/php.ini
    
    # php.ini中添加protobuf扩展
    $ vim /usr/local/php/etc/php.ini
    extension="protobuf.so"
    
    # 检查当前php扩展
    $ php -ir | grep protobuf
    protobuf
    
    # 重启php和nginx
    $ systemctl reload php-fpm
    $ systemctl reload nginx
    

    查看phpinfo中是否已经加载protobuffer的扩展

    phpinfo

    php-protobuf目录中使用composer加载依赖

    $ cd php-protobuf-master
    $ composer install
    

    若尚未安装composer则需要提前安装php包管理工具composer

    $ cd /php-protobuf-master
    $ curl -s http://getcomposer.org/install | php
    $ php composer.phar install
    

    将protobuf文件转换为php文件

    创建protobuffer测试文件,注意这里使用的pb2的语法。

    $ vim test.proto
    
    syntax="proto2"
    message Test
    {
      required int32 id = 1;
      require string username = 2;
    }
    

    使用protoc编译协议文件时,会在当前目录下生成对应的php类文件。编译生成代码时,会将protobuffermessage结构转换为包装类

    # 使用php-protobuf的protoc-gen-php.php脚本解析test.proto并生成类
    $ php /php-protobuf-master/protoc-gen-php.php test.proto
    

    使用时将生成的php代码拷贝到项目中,问题是这样做很麻烦!

    Windows环境下php使用protobuf

    1. 下载 protoc编译器,注意是windows版本的。

    https://github.com/protocolbuffers/protobuf/releases

    1. 使用protoc编译器将proto文件转换为php文件
    # 创建目录
    $ mkdir pb
    
    # 将当前目录下lobby.proto文件转换为php文件并输出到pb目录中
    $ protoc --php_out="./pb" ./lobby.proto
    

    编译成功后pb目录下将多出两个文件夹LobbyGPBMetadata

    1. composer.json配置添加自动加载项目
    $ vim package.json
    

    添加自动引用后,即可在项目中引入Lobby命名空间下的任何文件。

    "autoload": {
        "psr-4": {
            "Lobby\\": "pb/Lobby"
        },
        "files":[
            "pb/GPBMetadata/Lobby.php"
        ]
    }
    

    注意的是,由于proto文件会经常修改,所以生成出来的php脚本也是随着改变的,但生成时都时在同一个命令空间下,因此在composer的自动加载autoload中加载对应的命令空间,即可引入对应文件。

    相关文章

      网友评论

        本文标题:PHP Protobuffer

        本文链接:https://www.haomeiwen.com/subject/tyysmqtx.html