クイックスタート

このガイドでは、シンプルな動作例を使用してPHPでgRPCを開始する方法を説明します。

クイックスタート

このガイドでは、シンプルな動作例を使用してPHPでgRPCを開始する方法を説明します。

前提条件

  • PHP 7.0以降、PECL、Composer
  • grpc拡張機能、プロトコルバッファコンパイラー:インストール手順については、gRPC PHP readmeを参照してください。

サンプルコードを入手する

サンプルコードは、grpcリポジトリの一部です。

  1. grpcリポジトリとそのサブモジュールをクローンします。

    $ git clone --recurse-submodules -b v1.62.0 --depth 1 --shallow-submodules https://github.com/grpc/grpc
    
  2. クイックスタートのサンプルディレクトリに移動します。

    $ cd grpc/examples/php
    
  3. grpc composerパッケージをインストールします。

    $ ./greeter_proto_gen.sh
    $ composer install
    

サンプルを実行する

  1. クイックスタートサーバーを起動します。たとえば、Nodeのクイックスタートに記載されている手順に従ってください。

  2. examples/phpディレクトリから、PHPクライアントを実行します。

    $ ./run_greeter_client.sh
    

おめでとうございます!gRPCを使用してクライアントサーバーアプリケーションを実行しました。

gRPCサービスを更新する

次に、クライアントが呼び出すサーバー上の追加メソッドでアプリケーションを更新する方法を見てみましょう。gRPCサービスはプロトコルバッファを使用して定義されています。.protoファイルでサービスを定義する方法の詳細については、基本チュートリアルをご覧ください。今のところ知っておく必要があるのは、サーバーとクライアントの「スタブ」の両方に、クライアントからのHelloRequestパラメーターを受け取り、サーバーからHelloResponseを返すSayHello RPCメソッドがあり、このメソッドがこのように定義されていることです。

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}

これを更新して、Greeterサービスに2つのメソッドを持たせましょう。examples/protos/helloworld.protoを編集し、同じリクエストとレスポンスの型を持つ新しいSayHelloAgainメソッドで更新します。

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
  // Sends another greeting
  rpc SayHelloAgain (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
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

これにより、生成されたクライアントクラスと、リクエストとレスポンスの型を生成、シリアル化、および取得するためのクラスを含むprotobufファイルが再生成されます。

アプリケーションを更新して実行する

これで新しい生成されたクライアントコードが作成されましたが、例示アプリケーションの人間が記述した部分で新しいメソッドを実装して呼び出す必要があります。

サーバーを更新する

同じディレクトリで、greeter_server.jsを開きます。新しいメソッドを次のように実装します。

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();

実行!

以前と同じように、grpc-node/examples/helloworld/dynamic_codegenディレクトリから

  1. サーバーを実行します

    $ node greeter_server.js
    
  2. 別のターミナルから、examples/phpディレクトリからクライアントを実行します。

    $ ./run_greeter_client.sh
    

次は何をしますか?