gRPC для PHP: библиотеки и примеры реализации
gRPC (gRPC Remote Procedure Calls) — это высокопроизводительный фреймворк для удалённого вызова процедур, разработанный Google. Он использует Protocol Buffers (protobuf) в качестве языка описания интерфейсов и сериализации данных. В отличие от REST, gRPC работает поверх HTTP/2, поддерживает двустороннюю потоковую передачу и обеспечивает строгую типизацию. В этой статье мы разберём, как подключить gRPC в PHP, какие библиотеки использовать, и напишем полноценный пример клиент-серверного взаимодействия.
Обзор библиотек для gRPC в PHP
Для работы с gRPC в PHP доступны два основных подхода:
- Расширение grpc.so — официальное C-расширение от gRPC. Обеспечивает максимальную производительность, но требует компиляции и настройки на сервере.
- Чистый PHP-клиент (например,
grpc/grpcчерез Composer) — реализация на PHP, работающая через cURL и HTTP/2. Медленнее, но проще в развёртывании.
Для продакшена рекомендуется использовать расширение grpc, а для разработки или тестов — чистый PHP-клиент.
Установка необходимых компонентов
1. Установка protoc и плагина для PHP
Скачайте компилятор protobuf с официального репозитория под вашу ОС. Для генерации PHP-кода потребуется плагин protoc-gen-php-grpc:
# Установка protoc (Linux)
wget https://github.com/protocolbuffers/protobuf/releases/download/v25.0/protoc-25.0-linux-x86_64.zip
unzip protoc-25.0-linux-x86_64.zip -d /usr/local/protoc
export PATH=$PATH:/usr/local/protoc/bin
# Установка плагина для gRPC PHP
sudo apt-get install php-dev php-cli php-pear
sudo pecl install grpc
sudo pecl install protobuf
2. Установка Composer-зависимостей
Создайте проект и добавьте необходимые пакеты:
composer init
composer require grpc/grpc
composer require google/protobuf
Создание .proto файла
Определим простой сервис для работы с пользователями. Создайте файл 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 {}
Генерация PHP-кода из .proto
Выполните команду для компиляции .proto в PHP-классы:
protoc --php_out=./generated --grpc_out=./generated \
--plugin=protoc-gen-grpc=/usr/local/bin/grpc_php_plugin \
user.proto
В папке generated появятся файлы:
GPBMetadata/User.php— метаданные прото-файлаUser/UserRequest.php— класс запросаUser/UserResponse.php— класс ответаUser/UserServiceClient.php— клиент для вызова сервиса
Реализация gRPC сервера на PHP
Для серверной части используем официальное расширение grpc. Создайте файл server.php:
<?php
require_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@example.com');
return $response;
}
public function ListUsers(\User\Empty $request, $context): void
{
$users = [
['id' => 1, 'name' => 'Alice', 'email' => 'alice@example.com'],
['id' => 2, 'name' => 'Bob', 'email' => 'bob@example.com'],
];
foreach ($users as $data) {
$response = new UserResponse();
$response->setId($data['