gRPC für PHP: Bibliotheken und Implementierungsbeispiele
gRPC (gRPC Remote Procedure Calls) ist ein von Google entwickeltes Hochleistungs-Framework für entfernte Prozeduraufrufe. Es verwendet Protocol Buffers (protobuf) als Schnittstellenbeschreibungssprache und zur Datenserialisierung. Im Gegensatz zu REST arbeitet gRPC über HTTP/2, unterstützt bidirektionales Streaming und gewährleistet eine strenge Typisierung. In diesem Artikel werden wir erläutern, wie man gRPC in PHP einbindet, welche Bibliotheken verwendet werden, und ein vollständiges Beispiel für eine Client-Server-Kommunikation erstellen.
Überblick über Bibliotheken für gRPC in PHP
Für die Arbeit mit gRPC in PHP stehen zwei Hauptansätze zur Verfügung:
- Die Erweiterung grpc.so — die offizielle C-Erweiterung von gRPC. Bietet maximale Leistung, erfordert jedoch Kompilierung und Konfiguration auf dem Server.
- Reiner PHP-Client (z. B.
grpc/grpcüber Composer) — eine PHP-Implementierung, die über cURL und HTTP/2 arbeitet. Langsamer, aber einfacher bereitzustellen.
Für die Produktion wird die Verwendung der Erweiterung grpc empfohlen, für Entwicklung oder Tests der reine PHP-Client.
Installation der erforderlichen Komponenten
1. Installation von protoc und des Plugins für PHP
Laden Sie den protobuf-Compiler aus dem offiziellen Repository für Ihr Betriebssystem herunter. Für die Generierung von PHP-Code wird das Plugin protoc-gen-php-grpc benötigt:
# Installation von protoc (Linux)wget https://github.com/protocolbuffers/protobuf/releases/download/v25.0/protoc-25.0-linux-x86_64.zipunzip protoc-25.0-linux-x86_64.zip -d /usr/local/protocexport PATH=$PATH:/usr/local/protoc/bin
# Installation des Plugins für gRPC PHPsudo apt-get install php-dev php-cli php-pearsudo pecl install grpcsudo pecl install protobuf2. Installation der Composer-Abhängigkeiten
Erstellen Sie ein Projekt und fügen Sie die erforderlichen Pakete hinzu:
composer initcomposer require grpc/grpccomposer require google/protobufErstellen einer .proto-Datei
Definieren wir einen einfachen Dienst für die Arbeit mit Benutzern. Erstellen Sie die Datei user.proto:
syntax = "proto3";
package user;
service UserService { rpc GetUser (UserRequest) returns (UserResponse); rpc ListUsers (Empty) returns (stream UserResponse);}
message UserRequest { int32 id = 1;}
message UserResponse { int32 id = 1; string name = 2; string email = 3;}
message Empty {}Generierung von PHP-Code aus .proto
Führen Sie den Befehl zum Kompilieren der .proto-Datei in PHP-Klassen aus:
protoc --php_out=./generated --grpc_out=./generated \ --plugin=protoc-gen-grpc=/usr/local/bin/grpc_php_plugin \ user.protoIm Ordner generated erscheinen die folgenden Dateien:
GPBMetadata/User.php— Metadaten der Proto-DateiUser/UserRequest.php— Klasse der AnfrageUser/UserResponse.php— Klasse der AntwortUser/UserServiceClient.php— Client zum Aufrufen des Dienstes
Implementierung eines gRPC-Servers in PHP
Für den Serverteil verwenden wir die offizielle grpc-Erweiterung. Erstellen Sie die Datei server.php:
<?phprequire_once __DIR__ . '/vendor/autoload.php';require_once __DIR__ . '/generated/User/UserServiceInterface.php';require_once __DIR__ . '/generated/User/UserServiceServer.php';
use Grpc\\Server;use User\\UserRequest;use User\\UserResponse;use User\\UserServiceServer;
class MyUserService extends UserServiceServer{ public function GetUser(\\User\\UserRequest $request): \\User\\UserResponse { $response = new UserResponse(); $response->setId($request->getId()); $response->setName('John Doe'); $response->setEmail('john@exa