概述
Go语言使用Grpc较为轻松,文件生成过程比较顺利,但PHP使用Grpc时,如果使用windows系统,在生成文件阶段比较繁琐,具体可参考:官方文档
具体步骤
定义好proto文件,如下:
grpc/hello.proto
syntax = "proto3"; //协议版本
option go_package="/pb"; // 路径 及包名
package hello; //php使用
service Hello {
rpc SayHello (HelloReq) returns (HelloRes){}
}
message HelloReq {
string name =1;
}
message HelloRes {
string msg = 1;
}
运行命令生成php文件
生成是使用的这个镜像,里面安装好了protoc 和 grpc_php_plugin,参考以下操作
docker run --rm -it -v /host/file/dir:/root llaoj/php-grpc-gen:1.30.0 bash
cd protobuf-file-path
protoc --proto_path=. \
--php_out=. \
--grpc_out=. \
--plugin=protoc-gen-grpc=/opt/grpc/bin/grpc_php_plugin \
./hello.proto
执行完成后,会生成两个目录:Hello,GPBMetadata
将以上目录复制到对应PHP项目下,并配置composer.json
- 将文件复制到对应项目目录下,如/pkg/...
- 修改composer.json文件,require及psr-4中加入对应行
"autoload": {
"require": {
"grpc/grpc": "~1.30.0",
"google/protobuf": "~v3.12.2"
},
"psr-4": {
"GPBMetadata\\": ["GPBMetadata/","pkg/GPBMetadata/"],
"Hello\\": "pkg/Hello/"
}
}
测试
因php使用的是docker环境,go服务端使用的是宿主机,所以访问地址为host.docker.internal:50001,具体如下
$host= "host.docker.internal:50001";
$client = new TextServiceClient($host, [
"credentials" => ChannelCredentials::createInsecure()
]);
$req = new HelloReq();
$req->setName("张三");
list($response, $status) = $client->SayHello($req)->wait();
echo "ERROR: " . $status->code . ", " . $status->details . PHP_EOL;
if ($status->code !== STATUS_OK) {
echo "ERROR: " . $status->code . ", " . $status->details . PHP_EOL;
exit(1);
}
echo $response->getMsg() . PHP_EOL;