gRPC для PHP: библиотеки и примеры
gRPC — это современный высокопроизводительный фреймворк для удалённого вызова процедур (RPC), разработанный Google. Он использует HTTP/2 для транспорта, Protocol Buffers (protobuf) для сериализации данных и поддерживает множество языков, включая PHP. В этой статье мы разберём, как подключить gRPC к PHP-проекту, какие библиотеки необходимы, и напишем рабочий пример клиент-серверного взаимодействия.
Зачем нужен gRPC в PHP?
Традиционные REST API часто работают через JSON и HTTP/1.1, что приводит к избыточности данных и медленной сериализации. gRPC решает эти проблемы:
- Бинарный протокол — protobuf занимает меньше места, чем JSON, и обрабатывается быстрее.
- HTTP/2 — мультиплексирование, сжатие заголовков, потоковая передача.
- Строгая типизация — контракты описываются в .proto файлах, что упрощает разработку и отладку.
- Двусторонняя потоковая передача — сервер и клиент могут обмениваться данными асинхронно.
Основные библиотеки для gRPC в PHP
Для работы с gRPC в PHP потребуется два компонента:
- grpc.so — расширение PHP (C-расширение), реализующее HTTP/2 и gRPC-протокол.
- protobuf.so — расширение для сериализации protobuf (альтернатива — чистый PHP-пакет
google/protobuf). - Композер-пакеты:
grpc/grpcиgoogle/protobuf.
Рекомендуемый способ установки — через PECL (расширения) и Composer (зависимости).
Установка gRPC и protobuf
Для серверов на Linux (Ubuntu/Debian):
# Устанавливаем расширения через PECL
sudo pecl install grpc
sudo pecl install protobuf
# Добавляем в php.ini
echo "extension=grpc.so" >> /etc/php/8.2/cli/php.ini
echo "extension=protobuf.so" >> /etc/php/8.2/cli/php.ini
Для Windows скачайте DLL-файлы с PECL и укажите их в php.ini.
Далее устанавливаем библиотеки через Composer:
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 (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;
}
Генерация PHP-классов из .proto
Установите protoc и плагин для PHP:
# Скачайте protoc с https://github.com/protocolbuffers/protobuf/releases
# Затем сгенерируйте код:
protoc --php_out=./generated --grpc_out=./generated --plugin=protoc-gen-grpc=/usr/local/bin/grpc_php_plugin user.proto
В папке generated появятся классы: UserRequest, UserResponse, UserServiceClient и др.
Пример сервера gRPC на PHP
Создадим сервер, который будет отвечать на запросы. Файл 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);
$user->setName("User #$id");
$user->setEmail("user$id@example.com");
$response->finish($user);
}
public function ListUsers(\Grpc\ServerCallReader $request, \Grpc\Server