说明
gRPC是可以在任何环境中运行的现代开源高性能RPC框架。它可以通过可插拔的支持来有效地连接数据中心内和跨数据中心的服务,以实现负载平衡,跟踪,运行状况检查和身份验证。它也适用于分布式计算的最后一英里,以将设备,移动应用程序和浏览器连接到后端服务。
1. 安装GRPC扩展
pecl install protobuf // GPRC 使用的协议
pecl install grpc // 扩展
php.ini 引入扩展
extension=grpc.so
extension=protobuf.so
注意
1. pecl PHP版本必须大于 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
2. pecl 版本太旧问题可以使用一下更新命令
pecl channel-update pecl.php.net
3. 无法解压 unable to unpack
sudo chmod -R 777 /tmp/pear/download/*
4.引入扩展后需要重启php
2. 安装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
注意
1. 下载失败可是使用git加速器
wget https://g.ioiox.com/xxxx
wget https://ghproxy.com/xxxx
2. 解压失败
需要下载最新版本
3. 安装PHP composer 依赖库
// Grpc 依赖包
composer require grpc/grpc -vvv
// google/protobuf 依赖包
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 秒 | - |
配置镜像
composer config -g repos.packagist composer https://mirrors.aliyun.com/composer/
或者获取针对项目 composer.json 文件配置
"repositories":[
{
"type": "composer",
"url": "https://mirrors.aliyun.com/composer/"
}
]
3. 安装过程内存超出问题 Allowed memory size of XXXXXX bytes exhausted
COMPOSER_MEMORY_LIMIT=-1 composer <...>
4. 安装过程找不到 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
4. 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) {}
}
注意
1.gRPC protocol buffers。您需要具备以下条件才能开始使用
- protoc:protobuf编译器二进制文件,用于为您的消息和服务定义生成PHP类。
- grpc_php_plugin:protoc的插件,用于生成服务存根类。—(非必须)因为安装时间太长可以手写
- protobuf.so:protobuf扩展运行时库。
2.grpc_php_plugin 安装
git clone https://gitee.com/laiwi/grpc
cd grpc && git submodule update --init && make grpc_php_plugin
5.生成代码
1.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
2.手动方式
protoc --php_out=./extend/ rock_rpc.proto
注意
1. 手动方式需要编写客户端代码如下
<?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);
}
}
6.调用测试
//用于连接 服务端
$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);
7.目录结构
相关教程文档
http://doc.oschina.net/grpc?t=60136
https://grpc.io/
Protobuf3语言指南
https://github.com/grpc/grpc/tree/master/src/php