快速开始
本指南通过一个简单的工作示例帮助你入门使用 PHP 进行 gRPC 开发。
前提条件
-
PHP 7.0 或更高版本,PECL,Composer
-
gRPC 扩展,协议缓冲编译器:有关安装说明,请参阅 gRPC PHP 的 README 文件。
运行示例
-
启动快速开始服务器:例如,可以参考 Node.js 快速开始 中的指引。
-
在
examples/php
目录下运行 PHP 客户端:./run_greeter_client.sh
恭喜!你已经运行了一个客户端-服务器应用程序,使用了 gRPC
。
更新 gRPC 服务
接下来,我们来看一下如何在服务器上增加一个新方法供客户端调用。我们的 gRPC 服务是使用协议缓冲定义的;你可以在基础教程中了解更多关于如何在 .proto
文件中定义服务的内容。目前,你只需要知道的是,服务器和客户端 “存根” 都有一个 SayHello
RPC 方法,它接受来自客户端的 HelloRequest
参数,并返回来自服务器的 HelloResponse
,这个方法的定义如下:
// 问候服务定义
service Greeter {
// 发送问候
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// 包含用户姓名的请求消息
message HelloRequest {
string name = 1;
}
// 包含问候信息的响应消息
message HelloReply {
string message = 1;
}
让我们更新它,使得 Greeter
服务有两个方法。编辑 examples/protos/helloworld.proto
,并在其中添加一个新的 SayHelloAgain
方法,使用相同的请求和响应类型:
// 问候服务定义
service Greeter {
// 发送问候
rpc SayHello (HelloRequest) returns (HelloReply) {}
// 发送另一个问候
rpc SayHelloAgain (HelloRequest) returns (HelloReply) {}
}
// 包含用户姓名的请求消息
message HelloRequest {
string name = 1;
}
// 包含问候信息的响应消息
message HelloReply {
string message = 1;
}
记得保存文件!
重新生成 gRPC 代码
接下来,我们需要更新应用程序使用的 gRPC 代码,以便使用新的服务定义。在 gRPC
根目录下:
protoc --proto_path=examples/protos \
--php_out=examples/php \
--grpc_out=examples/php \
--plugin=protoc-gen-grpc=bins/opt/grpc_php_plugin \
./examples/protos/helloworld.proto
或者如果你通过源代码构建了 grpc-php-plugin
,可以在 grpc/example/php
目录下运行帮助脚本:
./greeter_proto_gen.sh
这将重新生成协议缓冲文件,其中包含生成的客户端类以及用于填充、序列化和检索请求和响应类型的类。
更新并运行应用程序
我们现在有了新的生成的客户端代码,但仍然需要在我们示例应用程序的手写部分实现并调用新方法。
更新服务器
在相同的目录下,打开 greeter_server.php
。像这样实现新方法:
function sayHello(call, callback) {
callback(null, {message: 'Hello ' + call.request.name});
}
function sayHelloAgain(call, callback) {
callback(null, {message: 'Hello again, ' + call.request.name});
}
function main() {
var server = new grpc.Server();
server.addProtoService(hello_proto.Greeter.service,
{sayHello: sayHello, sayHelloAgain: sayHelloAgain});
server.bind('0.0.0.0:50051', grpc.ServerCredentials.createInsecure());
server.start();
}
更新客户端
在相同的目录下,打开 greeter_client.php
。像这样调用新方法:
$request = new Helloworld\HelloRequest();
$request->setName($name);
list($reply, $status) = $client->SayHello($request)->wait();
$message = $reply->getMessage();
list($reply, $status) = $client->SayHelloAgain($request)->wait();
$message = $reply->getMessage();