如何基于 PHP 搭建 GRPC 服务


PHP7.4 搭建 GRPC 客户端服务

本地系统:MacBook M1 arm64
为了下载软件方便,统一采用 Homebrew 安装软件
php 目前只能搭建 gRPC 客户端,详见 gRPC官方文档
不过你要是想使用 php 搭建 grpc 客户端和服务端,你可以使用 php 基于 swoole 的 hyperf框架
如果你想使用 hyperf 搭建 grpc 客户端和服务端,你可以参考我的另一个 demo 项目 hyperf-grpc-demo
本文示例代码 php-grpc-demo

M1 下安装 php7.4 开发环境

下载 php


# 使用 homebrew 搜索 php
brew search php

# 使用 homebrew 安装 php7.4
brew install php@7.4

# 安装之后的 php7.4 在 /opt/homebrew/etc/php/7.4/ 目录下

# 因为 mac 下默认已经安装了 php7.3 ,如果你想首先使用 php7.4 版本时,需要执行
echo 'export PATH="/opt/homebrew/opt/php@7.4/bin:$PATH"' >> ~/.zshrc
echo 'export PATH="/opt/homebrew/opt/php@7.4/sbin:$PATH"' >> ~/.zshrc
  
# 如果想要让编译器找到 php7.4 那么还需要设置
export LDFLAGS="-L/opt/homebrew/opt/php@7.4/lib"
export CPPFLAGS="-I/opt/homebrew/opt/php@7.4/include"

# 写入 .zshrc 文件之后,需要执行 source 命令,重新加载配置信息
source ~/.zshrc

# 可以使用 homebrew 来管理 php7.4 的服务状态,比如重启
brew services restart php@7.4

# 如果不需要守护进程运行 php7.4 时,可以执行
/opt/homebrew/opt/php@7.4/sbin/php-fpm --nodaemonize

安装 composer

brew install composer

# 查看 composer 是否安装成功
composer -V

安装 GRPC 扩展

  • 安装 grpc 扩展
pecl install grpc

# 查看 grpc 扩展是否安装成功
php -m | grep grpc
  • 安装 protobuf 扩展
pecl install protobuf

# 查看 protobuf 扩展是否安装成功
php -m | grep protobuf

如果提示报错,报错信息如下所示

/opt/homebrew/Cellar/php@7.4/7.4.25/include/php/ext/pcre/php_pcre.h:25:10: fatal error: 'pcre2.h' file not found

可以参考这条 issue 去解决

# 我这里使用的是 php7.4 版本
# pcre2 版本是 10.39
# 因此我这里需要执行如下命令即可,需要注意我这里使用的是 m1 ,intel 芯片的 Mac homebrew 安装 php 的路径和 m1 芯片的路径不一致,需要按照你自己的实际路径去建立软连接
ln -s /opt/homebrew/Cellar/pcre2/10.39/include/pcre2.h /opt/homebrew/Cellar/php@7.4/7.4.25/include/php/ext/pcre/pcre2.h

生成 php-plugins 插件

这里因为 grpc/grpc 这个包非常大,有可能下载会不成功,因此我已经将编译好的 grpc_php_plugin 二进制文件以及 protoc 二进制文件上传到了 tools 目录下
方便各位同学可以直接使用


git clone -b v1.27.x https://github.com/grpc/grpc.git
# 如果速度慢的话,可以考虑 gitee 提供的镜像
git clone -b v1.27.x https://gitee.com/mirrors/grpc.git

# 安装 grpc 在 github 上的其他依赖
git submodule update --init

# 编译生成 grpc php 插件,生成 proto 文件时需要用到
# 执行成功之后会提示
# 比如我的生成之后提示了:[HOSTLD]  Linking /Users/pudongping/php-tools/grpc/bins/opt/grpc_php_plugin
# 这里我们只编译了 php 的插件,如果你需要编译所有的插件,你需要执行 `make && make install`
make grpc_php_plugin

# 生成的 grpc_php_plugin 插件在 `bins/opt/` 目录下
# 并且还会自动生成 protoc 文件,在 `bins/opt/protobuf` 目录下

执行 make grpc_php_plugin 时, 如果提示错误如下:

[AUTOGEN] Preparing protobuf
Can't exec "aclocal": No such file or directory at /opt/homebrew/Cellar/autoconf/2.71/share/autoconf/Autom4te/FileUtils.pm line 274.
autoreconf: error: aclocal failed with exit status: 2
make: *** [third_party/protobuf/configure] Error 2

那么需要安装

brew install automake

初始化项目

  • 项目初始化
# 先使用 composer 初始化项目
composer init
  • 安装 grpc composer 扩展包
composer require grpc/grpc
composer require google/protobuf
  • 使用 proto 文件生成 php 代码

以下命令在项目根目录下执行

# 当然你也可以将 protoc 二进制文件和 grpc_php_plugin 二进制文件移动到 `/usr/local/bin` 目录下,这样就不需要像我这样写绝对路径了

# 不会有 client stub 类
/Users/pudongping/php-tools/grpc/bins/opt/protobuf/protoc --php_out=plugins=grpc:./grpc ./proto/meet.proto

# 会有 client stub 类,我这里需要生成 client stub 类
/Users/pudongping/php-tools/grpc/bins/opt/protobuf/protoc --php_out=./grpc --grpc_out=./grpc --plugin=protoc-gen-grpc=/Users/pudongping/php-tools/grpc/bins/opt/grpc_php_plugin ./proto/meet.proto

测试

如果你想运行我的这个 demo ,你需要先下载 composer 依赖

# 在项目根目录下执行
composer install

你需要先启动服务端

服务端代码

然后再启动 php 客户端

php index.php
# string(14) " 你好,Alex"

文章作者: Alex
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Alex !
评论
  目录