Protocol Buffers(简称protobuf)是一种轻便高效的结构化数据存储格式,可用于结构化数据的串行化,适合做数据存储或RPC数据交换格式。可用于通讯协议、数据存储等领域的与语言无关、平台无关、可扩展的序列化结构数据格式。
Protocol Buffers是Google定义的一种跨语言、跨平台、可扩展的数据传输及存储的协议,因为将字段协议分别放在传输两端,传输数据中只包含数据本身,无需包含字段说明,所以传输数据量小,解析效率高。
- 对于数据结构的序列化反序列化等性能均优化于XML
- 代码生成机制,使用起来十分方便。
安装使用
-
protobuf
本身不支持php
,若要将.proto
文件转化为PHP
文件,需使用第三方程序。 -
protobuf3
中已支持PHP(Alpha) - https://github.com/google/protobuf/releases/tag/v3.1.0
环境部署
$ 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
的扩展
![4933701-c2bbad2f2c5719e9.png](https://i-blog.csdnimg.cn/blog_migrate/e791fc8b1d32a8057c98c5df70dadd14.png)
在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
类文件。编译生成代码时,会将protobuffer
的message
结构转换为包装类
# 使用php-protobuf的protoc-gen-php.php脚本解析test.proto并生成类
$ php /php-protobuf-master/protoc-gen-php.php test.proto
使用时将生成的php代码拷贝到项目中,问题是这样做很麻烦!
Windows环境下php使用protobuf
- 下载
protoc
编译器,注意是windows
版本的。
https://github.com/protocolbuffers/protobuf/releases
- 使用
protoc
编译器将proto
文件转换为php
文件
# 创建目录
$ mkdir pb
# 将当前目录下lobby.proto文件转换为php文件并输出到pb目录中
$ protoc --php_out="./pb" ./lobby.proto
编译成功后pb
目录下将多出两个文件夹Lobby
和GPBMetadata
-
composer.json
配置添加自动加载项目
$ vim package.json
添加自动引用后,即可在项目中引入Lobby命名空间下的任何文件。
"autoload": {
"psr-4": {
"Lobby\\": "pb/Lobby"
},
"files":[
"pb/GPBMetadata/Lobby.php"
]
}
注意的是,由于proto
文件会经常修改,所以生成出来的php
脚本也是随着改变的,但生成时都时在同一个命令空间下,因此在composer
的自动加载autoload
中加载对应的命令空间,即可引入对应文件。