gRPC pour PHP : bibliothèques et exemples
\n\ngRPC est un framework moderne et haute performance pour l'appel de procédures distantes (RPC), développé par Google. Il utilise HTTP/2 pour le transport, Protocol Buffers (protobuf) pour la sérialisation des données et prend en charge de nombreux langages, dont PHP. Dans cet article, nous allons voir comment intégrer gRPC à un projet PHP, quelles bibliothèques sont nécessaires, et écrire un exemple fonctionnel d'interaction client-serveur.
\n\nPourquoi utiliser gRPC en PHP ?
\nLes API REST traditionnelles fonctionnent souvent avec JSON et HTTP/1.1, ce qui entraîne une redondance des données et une sérialisation lente. gRPC résout ces problèmes :
\n- \n
- Protocole binaire — protobuf prend moins de place que JSON et est traité plus rapidement. \n
- HTTP/2 — multiplexage, compression des en-têtes, transmission en continu. \n
- Typage strict — les contrats sont décrits dans des fichiers .proto, ce qui simplifie le développement et le débogage. \n
- Transmission bidirectionnelle en continu — le serveur et le client peuvent échanger des données de manière asynchrone. \n
Bibliothèques principales pour gRPC en PHP
\nPour travailler avec gRPC en PHP, deux composants sont nécessaires :
\n- \n
- grpc.so — l'extension PHP (extension C) qui implémente HTTP/2 et le protocole gRPC. \n
- protobuf.so — l'extension pour la sérialisation protobuf (alternative : le paquet PHP pur
google/protobuf). \n - Paquets Composer :
grpc/grpcetgoogle/protobuf. \n
La méthode d'installation recommandée est via PECL (extensions) et Composer (dépendances).
\n\nInstallation de gRPC et protobuf
\nPour les serveurs Linux (Ubuntu/Debian) :
\n# Installation des extensions via PECL\nsudo pecl install grpc\nsudo pecl install protobuf\n\n# Ajout dans php.ini\necho "extension=grpc.so" >> /etc/php/8.2/cli/php.ini\necho "extension=protobuf.so" >> /etc/php/8.2/cli/php.ini\n\nPour Windows, téléchargez les fichiers DLL depuis PECL et indiquez-les dans php.ini.
\n\nEnsuite, installez les bibliothèques via Composer :
\ncomposer require grpc/grpc\ncomposer require google/protobuf\n\nCréation du fichier .proto
\nDécrivons un service pour la gestion des utilisateurs. Créez le fichier user.proto :
syntax = "proto3";\n\npackage user;\n\nservice UserService {\n rpc GetUser (UserRequest) returns (UserResponse);\n rpc ListUsers (Empty) returns (UserList);\n}\n\nmessage UserRequest {\n int32 id = 1;\n}\n\nmessage UserResponse {\n int32 id = 1;\n string name = 2;\n string email = 3;\n}\n\nmessage Empty {}\n\nmessage UserList {\n repeated UserResponse users = 1;\n}\n\nGénération des classes PHP à partir de .proto
\nInstallez protoc et le plugin pour PHP :
\n# Téléchargez protoc depuis https://github.com/protocolbuffers/protobuf/releases\n# Ensuite, générez le code :\nprotoc --php_out=./generated --grpc_out=./generated --plugin=protoc-gen-grpc=/usr/local/bin/grpc_php_plugin user.proto\n\nDans le dossier generated, les classes apparaîtront : UserRequest, UserResponse, UserServiceClient, etc.
Exemple de serveur gRPC en PHP
\nCréons un serveur qui répondra aux requêtes. Fichier server.php :
require_once __DIR__ . '/vendor/autoload.php';\nrequire_once __DIR__ . '/generated/UserServiceServer.php';\n\nuse Grpc\\Server;\nuse User\\UserServiceServer;\nuse User\\UserRequest;\nuse User\\UserResponse;\n\nclass MyUserService extends UserServiceServer\n{\n public function GetUser(\\Grpc\\ServerCallReader $request, \\Grpc\\ServerCallWriter $response, \\Grpc\\ServerContext $context): void\n {\n $req = $request->read();\n $id = $req->getId();\n\n $user = new UserResponse();\n $user->setId($id);\n $