## 参考文档列表
* PHP grpc官方文档 https://grpc.io/docs/quickstart/php.html
* PHP grpc官方案例 https://grpc.io/docs/tutorials/basic/php.html
* PHP grpc官方案例之github下载 https://github.com/grpc/grpc/tree/master/examples/php
## 一.环境搭建
### 1.安装grpc扩展
```pecl install grpc ```
修改php.ini文件 添加 ```extension=grpc.so ```
通过```php -m | grep grpc ```查看grpc.so是否安装成功
### 2.下载protoc命令
以mac为例:参考链接 https://www.jianshu.com/p/f8b789280df4
```protoc --version ```查看是否安装成功
### 3.安装PHP GRpc SDK
```git clone -b v1.15.0 https://github.com/grpc/grpc```
需要grpc-php-plugin来生成proto对应的php可执行文件。
```cd grpc && git submodule update --init && make grpc_php_plugin```
可与将 grpc_php_plugin 命令加入环境变量
## 二.通过protoc文件生成PHP文件
### 编写proto文件
```$xslt
syntax = "proto3";
package yunpian;
service YunPian {
rpc Send(SendSmsReq) returns (SendSmsRes);
}
message SendSmsReq {
string code = 1;
}
message SendSmsRes {
int32 code = 1;
string message = 2;
map<string, string> data = 3;
}
```
### protoc命令生成PHP文件
参考链接: https://www.cnblogs.com/ghj1976/p/5435565.html
```
protoc --proto_path=examples/protos --php_out=examples/php/route_guide --grpc_out=examples/php/route_guide
--plugin=protoc-gen-grpc=bins/opt/grpc_php_plugin ./examples/protos/route_guide.proto
```
proto_path对应proto文件的位置,php_out指定生成PHP文件的目录,grpc_out和php_out指定相同的目录,plugin对应上面安装的grpc_php_plugin命令路径,最后跟上具体proto的文件地址。
## 三.PHP客户端调用微服务 例子1
### proto文件编辑
```
syntax = "proto3";
package yunpian;
service YunPian {
rpc Send(SendSmsReq) returns (SendSmsRes);
}
message SendSmsReq {
string code = 1;
}
message SendSmsRes {
int32 code = 1;
string message = 2;
map<string, string> data = 3;
}
```
通过protoc命令生成PHP文件
```
protoc --proto_path=examples/protos --php_out=examples/php/route_guide --grpc_out=examples/php/route_guide
--plugin=protoc-gen-grpc=bins/opt/grpc_php_plugin ./examples/protos/route_guide.proto
```
通过composer安装consule-php-sdk等包
```
"require": {
"grpc/grpc": "^v1.3.0",
"google/protobuf": "^v3.3.0",
"sensiolabs/consul-php-sdk": "^3.0"
},
```
```
require dirname(__FILE__).'/../vendor/autoload.php';
define('COORD_FACTOR', 1e7);
$serviceFactory = new SensioLabs\Consul\ServiceFactory();
$cl = $serviceFactory->get("catalog"); //采用cataLog的服务方式
$service = $cl->service("yunpian"); //参数传入和服务端约定的服务名
$microServiceData = \GuzzleHttp\json_decode($service->getBody(), true)[0]; //请求微服务的具体地址
$host = $microServiceData["ServiceAddress"];
$port = $microServiceData["ServicePort"];
$client = new Yunpian\YunPianClient($host.":".$port, [
'credentials' => Grpc\ChannelCredentials::createInsecure(),
]);
$reqObj = new Yunpian\SendSmsReq(); //自定义请求
$reqObj->setCode("1234");
list($data, $status) = $client->Send($reqObj)->wait();
var_dump($data->getCode());
var_dump($data->getMessage());
var_dump($data->getData());
```
源码:[go-grpc-getway](https://github.com/juelite/micro-srv)
有疑问加站长微信联系(非本文作者))