说明

gRPC是可以在任何环境中运行的现代开源高性能RPC框架。它可以通过可插拔的支持来有效地连接数据中心内和跨数据中心的服务,以实现负载平衡,跟踪,运行状况检查和身份验证。它也适用于分布式计算的最后一英里,以将设备,移动应用程序和浏览器连接到后端服务。

1. 安装GRPC扩展

  1. pecl install protobuf // GPRC 使用的协议
  2. pecl install grpc // 扩展

php.ini 引入扩展

  1. extension=grpc.so
  2. extension=protobuf.so

注意

1. pecl PHP版本必须大于 7.0 可以使用一下命令
  1. // 查看版本
  2. pecl version
  3. >> PEAR Version: 1.10.9
  4. >> PHP Version: 7.1.33
  5. >> Zend Engine Version: 3.1.0
  6. // 如果默认pecl PHP版本小于7.0 则可以使用一下路径方式
  7. /www/server/php/71/bin/pecl install protobuf
  8. /www/server/php/71/bin/pecl install grpc

2. pecl 版本太旧问题可以使用一下更新命令
  1. pecl channel-update pecl.php.net

3. 无法解压 unable to unpack
  1. sudo chmod -R 777 /tmp/pear/download/*

4.引入扩展后需要重启php

2. 安装protoc编译器

  1. // 下载软件包
  2. wget https://g.ioiox.com/https://github.com/protocolbuffers/protobuf/releases/download/v3.14.0/protoc-3.14.0-linux- x86_64.zip
  3. // 将包移动到指定文件夹
  4. mv protoc-3.14.0-linux-x86_64.zip protoc
  5. // 解压
  6. unzip protoc-3.14.0-linux-x86_64.zip
  7. // 配置命令快捷方式
  8. ln -s /root/protoc/bin/protoc /usr/sbin/protoc
  9. export PATH="$PATH:/usr/sbin/protoc"
  10. // 验证是否成功 libprotoc 3.14.0
  11. protoc --version

注意

1. 下载失败可是使用git加速器
  1. wget https://g.ioiox.com/xxxx
  2. wget https://ghproxy.com/xxxx

2. 解压失败
  1. 需要下载最新版本

3. 安装PHP composer 依赖库

  1. // Grpc 依赖包
  2. composer require grpc/grpc -vvv
  3. // google/protobuf 依赖包
  4. composer require google/protobuf -vvv

注意

1. -vvv 可以显示安装过程 去除则不显示安装过程

2. composer下载安装慢的问题

国内由于不可控因素,官方的服务器常常连接不上。所以可以使用一下国内镜像列表。
镜像名 地址 赞助商 更新频率 备注
阿里云 Composer 镜像 https://mirrors.aliyun.com/composer/ 阿里云 96 秒 推荐
腾讯云 Composer 镜像 https://mirrors.cloud.tencent.com/composer/ 腾讯云 24 小时 -
PHP 国内 Composer 镜像 https://packagist.phpcomposer.com 仁润股份 24 小时 不稳定
华为云 Composer 镜像 https://repo.huaweicloud.com/repository/php/ 华为云 未知 未知
php.cnpkg.org Composer 镜像 https://php.cnpkg.org 安畅网络 60 秒 -

配置镜像
  1. composer config -g repos.packagist composer https://mirrors.aliyun.com/composer/

或者获取针对项目 composer.json 文件配置
  1. "repositories":[
  2. {
  3. "type": "composer",
  4. "url": "https://mirrors.aliyun.com/composer/"
  5. }
  6. ]

3. 安装过程内存超出问题 Allowed memory size of XXXXXX bytes exhausted
  1. COMPOSER_MEMORY_LIMIT=-1 composer <...>

4. 安装过程找不到 ext-mcrypt 扩展 The requested PHP extension ext-mcrypt * is missing
  1. 建议使用 PHP7.4> PHP版本 => PHP 7.0
  2. // 也可以指定PHP版本 php_71为自定义命令 可以指定PHP路径使用
  3. COMPOSER_MEMORY_LIMIT=-1 php_71 /usr/bin/composer

4. protocol buffers

  1. // test.proto
  2. syntax = "proto3"; // 指定proto版本
  3. package test; // 指定包名
  4. message StreamRequest{
  5. string token = 1;
  6. }
  7. message StreamResponse{
  8. uint32 id = 1;
  9. string load= 2;
  10. }
  11. service TestRpcServer{
  12. rpc Sync(StreamRequest) returns (stream StreamResponse) {}
  13. }

注意

1.gRPC protocol buffers。您需要具备以下条件才能开始使用
  • protoc:protobuf编译器二进制文件,用于为您的消息和服务定义生成PHP类。
  • grpc_php_plugin:protoc的插件,用于生成服务存根类。—(非必须)因为安装时间太长可以手写
  • protobuf.so:protobuf扩展运行时库。
    2.grpc_php_plugin 安装
    1. git clone https://gitee.com/laiwi/grpc
    2. cd grpc && git submodule update --init && make grpc_php_plugin

5.生成代码

1.grpc_php_plugin 方式

  1. // 示例一
  2. protoc --proto_path=./ --plugin=protoc-gen-grpc=/usr/local/grpc/bins/opt/grpc_php_plugin --php_out=./ --grpc_out=./ test.proto
  3. // 示例二
  4. protoc --php_out=./extend/ --grpc_out=./extend/ --plugin=protoc-gen-grpc=/root/grpc/bins/opt/grpc_php_plugin rock_rpc.proto
  5. protoc --php_out=./extend/ --grpc_out=./extend/ --plugin=protoc-gen-grpc=/root/grpc/bins/opt/grpc_php_plugin rock_rpc.proto

2.手动方式

  1. protoc --php_out=./extend/ rock_rpc.proto

注意

1. 手动方式需要编写客户端代码如下
  1. <?php
  2. namespace Rock;
  3. use Grpc\BaseStub;
  4. class RockClient extends BaseStub
  5. {
  6. public function __construct($hostname, $opts, $channel = null)
  7. {
  8. parent::__construct($hostname, $opts, $channel);
  9. }
  10. /**
  11. * 用于请求和响应该服务
  12. * @param StreamRequest $argument
  13. * @param array $metadata
  14. * @param array $options
  15. * @return
  16. */
  17. public function Sync(StreamRequest $argument, $metadata = [], $options = [])
  18. {
  19. return $this->_simpleRequest('/rock.RockRpcServer/Sync',
  20. $argument,
  21. ['\Rock\StreamedResponse', 'decode'],
  22. $metadata, $options);
  23. }
  24. }

6.调用测试

  1. //用于连接 服务端
  2. $client = new RockClient('127.0.0.1:8081', [
  3. 'credentials' => ChannelCredentials::createInsecure(),
  4. ]);
  5. //实例化请求类
  6. $request = new StreamRequest();
  7. $request->setToken("xxxxxx");
  8. // halt($request->getToken());
  9. //调用远程服务
  10. $get = $client->Sync($request)->wait();
  11. dump($get);

7.目录结构

PHP 安装使用 GRPC 完整教程 - 图1

相关教程文档

http://doc.oschina.net/grpc?t=60136
https://grpc.io/
Protobuf3语言指南
https://github.com/grpc/grpc/tree/master/src/php