前言
大家好,这是我在博客园的第一篇博文,很早之前就想尝试开通技术博客了,但是由于各种原因计划一直都没有实施。开通博客只是想简单的记录下自己生活工作相关的一些事情,之前一直在用evernote记录,无法用更多的人分享一些信息和交流,所以打算开通博客,将之前evernote上记录的一些经历分享出来和大家一起探讨学习,初步定于每星期更新一篇博文,以后有时间可以能会增加更新的频率,因为不经常写,所以文采可以忽略,有错误的地方还望大家及时指正。废话不多说,下面开始我的第一篇博文
正文
本文主要介绍下php结合protobuf的一些相关用法,首先php相信大家都比较了解,它是一门主要用于web开发的解释型高级面向对象的计算机编程语言,其全称是超文本预处理器(Hypertext Preprocessor),现在的最新稳定版本是7.1。下面重点介绍下protobuf,protobuf是谷歌开源的一种用于数据交换的开源协议,其主要的特点是跨平台、跨语言、可扩展,它是一种用于序列化结构数据的开源协议。目前业界在扩平台、跨语言的领域数据交换用的最多的是使用json,但是相较于json,protobuf主要的特点表现为可扩展性强、安全性好、速度更快,下面我们就详细看下php是怎么结合protobuf序列化结构数据的
1、首先需要在开发机上面安装protobuf,这里建议在github上克隆下来源码编译安装,如要步骤如下:
1)git clone https://github.com/protocolbuffers/protobuf.git
进入到源码目录protobuf执行autogen.sh文件初始化安装目录(注:在执行的过程中有时候回报错,无法执行,可能是因为automake没有安装,安装完automake在执行一般就可以了)
2)./authgen.sh
初始化安装目录之后就可以看到,当前目录下面有生成configure文件,接下来就是安装linux下面标准的编译安装步骤执行就可以了
3)./configure
4)make
5)make install
执行完以上操作之后在本地就完成了protobuf的安装,如果安装成功可以执行protoc --version查看下当前安装的版本
2、接下来就要安装php的protobuf的扩展
1)执行以下命令获取protobuf的php扩展源码
git clone https://github.com/allegro/php-protobuf.git
2)获取完源码之后进入到php-protobuf目录,按如下步骤安装protobuf的php扩展
cd php-protobuf
phpize
make
make install
3)执行完以上命令之后,在php的扩展目录下会生成一个protobuf.so的动态链接库文件,在php的配置文件中新增extension=protobuf.so的配置,通过php -m命令查看扩展是否有生效。
4)最后在php-protobuf的目录下面执行composer install安装php-protobuf相关的依赖包
3、完成了以上的准备工作之后,我们就可以开始正式的php+protobuf的开发工作了
1)首先我们需要新增protobuf的文件,我们命名为foo.proto,内容如下:
syntax = "proto2"; message Foo { required int32 bar = 1; optional string baz = 2; repeated float spam = 3; }
这里我们定义了一个简单消息类型,其拥有三种数据类型
2)接着我们要使用protoc工具将.proto的文件转换成php的代码,命令如下:
php protoc-gen-php.php foo.proto
执行完以上命令之后会在当前目录下生成一个Foo.php的文件,这就是我们之前定义的Foo的php类文件,之后直接因为这个类文件我们就可以操作Foo类了
3)最后我们新增一个testFoo.php的文件来使用Foo类,代码如下:
require_once 'Foo.php'; $foo = new Foo(); $foo->setBar('string'); $foo->setBaz(1); $foo->appendSpam(3.0); $foo->appendSpam(4.0); $packed = $foo->serializeToString(); $parsedFoo = new Foo(); $parsedFoo->clearSpam(); try { $parsedFoo->parseFromString($packed); } catch (Exception $ex) { die('Oops.. there is a bug in this example, ' . $ex->getMessage()); } $parsedFoo->dump();
执行这个文件之后就会打印如下内容:
Foo { 1: bar => 0 2: baz => "1" 3: spam(2) => [0] => 3 [1] => 4 }
到此为止我们就完成了一个基本的php+protobuf的开发工作,关于protobuf更多内容的以后再详细介绍。
谢谢大家,有不对的地方希望大家多多指正