再来一次手牵手:php7.0+protobuf

这两天在折腾 php。

php 作为世界世界上最好的编程语言,我不过是读研那会给导师做项目的时候撸过一年的代码,水平一般,只了解基本的语法,会进行简单的 php 后台开发,后来就没再用过了。

这次,是为了工作需要,在整理项目模块的时候,同事反映“之前的 php5.x 对 protobuf 的支持不是很好,解码出来的数据结构跟其它语言的对不上……”, 我当时的第一反应是:居然有这种事?至于具体是不是真的如此,我也懒得去重现。那是两年前的事,现在 php 都到 7.x ,protobuf 都到 3.5.1 了,时过境迁,IT 技术日新月异,或许问题早就解决了呢?

报着试一试的态度,我主动提出来调研下 “protobuf 在 php7.0 的用法”。

php

docker 里面现成的 php 镜像多的是,想要快的话,直接 run 一个 php 容器出来就可以,但是我想从零开始,体验下 Linux 配置 php 开发环境的流程,一步一个脚印,给人一种稳重的安全感。

所以,所以还是从一个裸体的 ubuntu 系统开始吧。

启动一个 容器:

先装 php 的,这里我选了 7.0 版本:

装个 nginx 服务器来驱动 php 脚本吧:

配置下 nginx,开启 php 解释器, 修改 这部分如下:

启动 PHP 和 nginx 服务:

这样,php 运行环境就搭建好了,可以写个简单的 PHP 脚本 来验证下,把它放在 nginx 默认的网站根目录 中:

现在就是见证奇迹的时刻:

只需几步就配置好了 php 运行环境,真是 Excited!

protobuf

php7 要使用 Google protobuf 需要安装两个东西: 和 。

protoc 编译器

到 下载 linux 平台的 protoc ,把 和 里面的文件拷贝到 的对应目录,这样 protoc 就算安装完成了:

写个 :

这个 proto 文件是什么意思,相信用过 proto 的人都知道。

编译 proto 文件:

可以看到,protoc 编译出的结果里包含一个 三个 php 文件(对应 proto 文件里面声明的三种结构)和 一个 文件夹(下面的 描述了 文件的元信息)。

php 扩展库

protobuf 的 php 扩展 官方 提供了 c 动态库 和 php 包两种形式。

php 包形式我折腾了半天也不会用,烦死了。还是安装 c 动态库形式的扩展吧:

提示安装成功,但还需要修改 php 的配置文件 , 开启 protobuf 库支持:

重启 php7.0-fpm 服务。

Dev

准备工作做好后,就可以正式进行 protobuf 解析了。

写个测试例子 :

访问 输出:

看上去,protobuf 的 和 都没有问题。

一切看上去都那么自然,但,这里有个问题,不得不提下。测试发现:

在中,必须引入 proto 文件中声明过的所有结构类型(即使你只用到了里面的一个类型),否则会报错。

比如,注释掉这行 (事实上,AddressBook 这个类也没有用到), nginx-error 日志输出:

这个就很恶心了,“我只想要个苹果,你却给我一车梨?”。具体原因我还不知道,谁能帮我解释下吗?

总结

php 本身的确是门很简单易用的语言,加上我当年学到的东西还没有忘光,所以重新拾起来还是有故人重逢的感觉。

小试牛刀发现:php7.0 下 protobuf 扩展是可以用的,配置起来也不是很难。

然后,我在调研过程中,还是留了 2 个坑:

php 扩展包的另外一种安装方式

拔一发而动全身:必须引入 proto 文件中声明过的所有结构类型

有收获,也有遗憾,这次 php+protobuf 的填坑之旅就这样告一段落吧。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180119G0MQQP00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券