gRPC para PHP: bibliotecas e exemplos
gRPC é um framework moderno e de alto desempenho para chamadas de procedimentos remotos (RPC), desenvolvido pelo Google. Ele utiliza HTTP/2 para transporte, Protocol Buffers (protobuf) para serialização de dados e suporta várias linguagens, incluindo PHP. Neste artigo, vamos abordar como conectar gRPC a um projeto PHP, quais bibliotecas são necessárias e escrever um exemplo funcional de interação cliente-servidor.
Por que usar gRPC em PHP?
APIs REST tradicionais geralmente funcionam com JSON e HTTP/1.1, o que leva à redundância de dados e serialização lenta. O gRPC resolve esses problemas:
- Protocolo binário — protobuf ocupa menos espaço que JSON e é processado mais rapidamente.
- HTTP/2 — multiplexação, compressão de cabeçalhos, transmissão por streaming.
- Tipagem forte — contratos são descritos em arquivos .proto, simplificando o desenvolvimento e a depuração.
- Streaming bidirecional — servidor e cliente podem trocar dados de forma assíncrona.
Principais bibliotecas para gRPC em PHP
Para trabalhar com gRPC em PHP, são necessários dois componentes:
- grpc.so — extensão PHP (extensão C) que implementa HTTP/2 e o protocolo gRPC.
- protobuf.so — extensão para serialização protobuf (alternativa: pacote PHP puro
google/protobuf). - Pacotes Composer:
grpc/grpcegoogle/protobuf.
A forma recomendada de instalação é via PECL (extensões) e Composer (dependências).
Instalação do gRPC e protobuf
Para servidores Linux (Ubuntu/Debian):
# Instalar extensões via PECLsudo pecl install grpcsudo pecl install protobuf
# Adicionar ao php.iniecho "extension=grpc.so" >> /etc/php/8.2/cli/php.iniecho "extension=protobuf.so" >> /etc/php/8.2/cli/php.iniPara Windows, baixe os arquivos DLL do PECL e adicione-os ao php.ini.
Em seguida, instale as bibliotecas via Composer:
composer require grpc/grpccomposer require google/protobufCriação do arquivo .proto
Vamos descrever um serviço para trabalhar com usuários. Crie o arquivo user.proto:
syntax = "proto3";
package user;
service UserService { rpc GetUser (UserRequest) returns (UserResponse); rpc ListUsers (Empty) returns (UserList);}
message UserRequest { int32 id = 1;}
message UserResponse { int32 id = 1; string name = 2; string email = 3;}
message Empty {}
message UserList { repeated UserResponse users = 1;}Geração de classes PHP a partir do .proto
Instale o protoc e o plugin para PHP:
# Baixe o protoc em https://github.com/protocolbuffers/protobuf/releases# Em seguida, gere o código:protoc --php_out=./generated --grpc_out=./generated --plugin=protoc-gen-grpc=/usr/local/bin/grpc_php_plugin user.protoNa pasta generated, aparecerão as classes: UserRequest, UserResponse, UserServiceClient, entre outras.
Exemplo de servidor gRPC em PHP
Vamos criar um servidor que responderá às requisições. Arquivo server.php:
require_once __DIR__ . '/vendor/autoload.php';require_once __DIR__ . '/generated/UserServiceServer.php';
use Grpc\\Server;use User\\UserServiceServer;use User\\UserRequest;use User\\UserResponse;
class MyUserService extends UserServiceServer{ public function GetUser(\\Grpc\\ServerCallReader $request, \\Grpc\\ServerCallWriter $response, \\Grpc\\ServerContext $context): void { $req = $request->read(); $id = $req->getId();
$user = new UserResponse(); $user->setId($id); $