初识protobuf和php的相关用法

耗尽温柔 提交于 2020-01-31 07:56:50

前言  

  大家好,这是我在博客园的第一篇博文,很早之前就想尝试开通技术博客了,但是由于各种原因计划一直都没有实施。开通博客只是想简单的记录下自己生活工作相关的一些事情,之前一直在用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更多内容的以后再详细介绍。

    谢谢大家,有不对的地方希望大家多多指正

  

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!