app开发

PHP Protobuffer

2019-03-16  本文已影响0人  JunChow520

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

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

安装使用

$ 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编译器

# 下载安装包
$ 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中加载对应的命令空间,即可引入对应文件。

上一篇下一篇

猜你喜欢

热点阅读