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

安装php-grpc扩展

pecl install protobuf // GPRC 使用的协议
pecl install grpc  // 扩展
  • php.ini 引入扩展
extension=grpc.so
extension=protobuf.so

注意事项

  • PECLPHP版本必须大于7.0可以使用一下命令查看
// 查看版本
pecl version 

>> PEAR Version: 1.10.9
>> PHP Version: 7.1.33
>> Zend Engine Version: 3.1.0


// 如果默认pecl PHP版本小于7.0 则可以使用一下路径方式
/www/server/php/71/bin/pecl install protobuf
/www/server/php/71/bin/pecl install grpc
  • PECL版本太旧问题可以使用一下更新命令
pecl channel-update pecl.php.net
  • 无法解压异常unable to unpack
sudo chmod -R 777 /tmp/pear/download/*

引入扩展后需要重启PHP

安装protoc编译器

// 下载软件包

wget https://g.ioiox.com/https://github.com/protocolbuffers/protobuf/releases/download/v3.14.0/protoc-3.14.0-linux-                                                             x86_64.zip

// 将包移动到指定文件夹
mv protoc-3.14.0-linux-x86_64.zip protoc

// 解压
unzip protoc-3.14.0-linux-x86_64.zip

// 配置命令快捷方式
ln -s  /root/protoc/bin/protoc   /usr/sbin/protoc
export PATH="$PATH:/usr/sbin/protoc"

// 验证是否成功 libprotoc 3.14.0
protoc --version

注意事项

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

wget https://ghproxy.com/xxxx
  • 解压失败
需要下载最新版本

安装PHP Composer依赖库

// Grpc 依赖包
composer require grpc/grpc -vvv

// google/protobuf 依赖包
composer require google/protobuf -vvv

注意事项

  1. -vvv 可以显示安装过程 去除则不显示安装过程
  2. composer下载安装慢的问题
composer config -g repos.packagist composer https://mirrors.aliyun.com/composer/
  • 或者获取针对项目 composer.json 文件配置
"repositories":[
        {
            "type": "composer",
            "url": "https://mirrors.aliyun.com/composer/"
        }
]
  • 安装过程内存超出问题 Allowed memory size of XXXXXX bytes exhausted
COMPOSER_MEMORY_LIMIT=-1 composer <...>
  • 安装过程找不到 ext-mcrypt 扩展 The requested PHP extension ext-mcrypt * is missing
建议使用  PHP7.4> PHP版本 => PHP 7.0
// 也可以指定PHP版本 php_71为自定义命令 可以指定PHP路径使用
COMPOSER_MEMORY_LIMIT=-1 php_71 /usr/bin/composer

protocol buffers

// test.proto
syntax = "proto3";  // 指定proto版本

package test; // 指定包名

message StreamRequest{
    string token = 1;
}
message StreamResponse{
    uint32 id = 1;
    string load= 2;
}
service TestRpcServer{
    rpc Sync(StreamRequest) returns (stream StreamResponse) {}
}

注意事项

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

生成代码

  • grpc_php_plugin 方式

    // 示例一
    protoc --proto_path=./ --plugin=protoc-gen-grpc=/usr/local/grpc/bins/opt/grpc_php_plugin --php_out=./ --grpc_out=./ test.proto 
    // 示例二
    protoc --php_out=./extend/ --grpc_out=./extend/ --plugin=protoc-gen-grpc=/root/grpc/bins/opt/grpc_php_plugin rock_rpc.proto
    
    protoc --php_out=./extend/ --grpc_out=./extend/ --plugin=protoc-gen-grpc=/root/grpc/bins/opt/grpc_php_plugin rock_rpc.proto
    
    
    
    
  • 手动方式

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

注意事项

  • 手动方式需要编写客户端代码如下
<?php


namespace Rock;


use Grpc\BaseStub;

class RockClient extends BaseStub
{
    public function __construct($hostname, $opts, $channel = null)
    {
        parent::__construct($hostname, $opts, $channel);
    }

    /**
     * 用于请求和响应该服务
     * @param StreamRequest $argument
     * @param array         $metadata
     * @param array         $options
     * @return
     */
    public function Sync(StreamRequest $argument, $metadata = [], $options = [])
    {
        return $this->_simpleRequest('/rock.RockRpcServer/Sync',
            $argument,
            ['\Rock\StreamedResponse', 'decode'],
            $metadata, $options);
    }

}

调用测试

                 //用于连接 服务端
        $client = new RockClient('127.0.0.1:8081', [
            'credentials' => ChannelCredentials::createInsecure(),
        ]);


        //实例化请求类
        $request        = new StreamRequest();
        $request->setToken("xxxxxx");
        // halt($request->getToken());
        //调用远程服务
        $get = $client->Sync($request)->wait();

        dump($get);

目录结构

lake_card_mindmap.png

相关教程文档

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