在 PHP 中实现 gRPC 服务端,你需要遵循以下步骤:
安装 gRPC 和 Protocol Buffers 扩展:
首先,确保你已经安装了 gRPC 和 Protocol Buffers 扩展。可以通过 PECL 安装 gRPC 扩展:
pecl install grpc
然后,在 php.ini
文件中添加以下行以启用 gRPC 扩展:
extension=grpc.so
定义 .proto
文件:
创建一个 .proto
文件来定义你的服务接口和消息结构。例如,创建一个名为 hello_world.proto
的文件,内容如下:
syntax = "proto3";
package helloworld;
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply);
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
生成 PHP 代码:
使用 protoc
编译器生成 PHP 代码。确保你已经安装了 protoc-gen-php
和 protoc-gen-grpc
插件。然后运行以下命令:
protoc --php_out=. --grpc_out=. --plugin=protoc-gen-grpc=`which grpc_php_plugin` hello_world.proto
这将生成 GPBMetadata/Helloworld/HelloWorld.php
和 Helloworld/GreeterClient.php
文件。
实现服务端:
创建一个名为 server.php
的文件,实现你的服务端代码。首先,引入生成的 PHP 代码,然后实现 Greeter
服务:
<?php
require_once 'vendor/autoload.php';
require_once 'GPBMetadata/Helloworld/HelloWorld.php';
require_once 'Helloworld/GreeterServer.php';
use Helloworld\HelloRequest;
use Helloworld\HelloReply;
use Helloworld\GreeterServer;
use Grpc\Server;
use Grpc\ServerContext;
class GreeterService extends GreeterServer
{
public function SayHello(ServerContext $context, HelloRequest $request): HelloReply
{
$name = $request->getName();
$reply = new HelloReply();
$reply->setMessage("Hello, $name!");
return $reply;
}
}
$server = new Server([
'host' => '0.0.0.0:50051',
'credentials' => null,
]);
$server->addService(GreeterServer::serviceName(), new GreeterService());
$server->start();
运行服务端:
在命令行中运行以下命令启动服务端:
php server.php
现在,你的 gRPC 服务端已经在监听 50051 端口。你可以使用客户端代码连接到此服务并调用 SayHello
方法。