API на PHP: REST, GraphQL и gRPC — что выбрать в 2025?

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение: API — это не магия, а инструмент

Когда ваш PHP-сайт перестаёт быть статичной страничкой и начинает общаться с внешним миром — Telegram-ботами, платёжными шлюзами или собственным мобильным приложением — вы неизбежно сталкиваетесь с API (Application Programming Interface). Это просто контракт: «Если ты пришлёшь мне запрос вот в таком формате, я верну тебе данные». Сегодня на PHP-арене три главных игрока: классический REST, гибкий GraphQL и дерзкий gRPC. Какой выбрать? Давайте разбираться на живых примерах.

Статья написана для тех, кто уже умеет писать на PHP и хочет расширить кругозор. Мы будем не просто копировать документацию, а смотреть на каждый протокол глазами разработчика, который решает реальную задачу.

REST API на PHP: проверенная классика

REST (Representational State Transfer) — это не протокол, а архитектурный стиль. Он использует HTTP-методы (GET, POST, PUT, DELETE) для работы с ресурсами. Если вы когда-нибудь писали file_get_contents('https://api.example.com/users') — вы уже работали с REST.

Почему REST остаётся королём?

  • Простота: любой HTTP-клиент умеет с ним работать.
  • Кэширование: на уровне HTTP можно кэшировать GET-запросы.
  • Широкая поддержка: от curl до специализированных библиотек.

Пример REST-клиента на PHP с Guzzle

Библиотека Guzzle — это стандарт де-факто для HTTP-запросов в PHP. Установите её через Composer: composer require guzzlehttp/guzzle.

<?php
require 'vendor/autoload.php';

use GuzzleHttp\Client;

$client = new Client([
    'base_uri' => 'https://jsonplaceholder.typicode.com/',
    'timeout'  => 5.0,
]);

// GET-запрос
$response = $client->get('posts/1');
$post = json_decode($response->getBody(), true);
echo "Заголовок поста: " . $post['title'] . PHP_EOL;

// POST-запрос
$response = $client->post('posts', [
    'json' => [
        'title' => 'Новый пост',
        'body' => 'Текст поста',
        'userId' => 1
    ]
]);
echo "Создан пост с ID: " . json_decode($response->getBody(), true)['id'];
?>

Что мы сделали? Просто отправили HTTP-запросы. REST не требует специальной библиотеки — можно использовать даже file_get_contents() с контекстом, но Guzzle даёт удобную обработку ошибок, middleware и потоковую передачу.

Когда REST — не лучший выбор?

Если вам нужно получить связанные данные (например, пост + автор + комментарии), REST заставит делать несколько запросов. Тут и выходит на сцену GraphQL.

GraphQL на PHP: запрашивай только то, что нужно

GraphQL — это язык запросов, разработанный Facebook. Клиент сам описывает структуру ответа. Один запрос — один ответ, без перебора и недобора данных.

Как работает GraphQL на PHP?

Серверная часть: библиотека webonyx/graphql-php (установка: composer require webonyx/graphql-php). Клиентская часть — обычный HTTP-запрос POST с JSON-телом.

Пример GraphQL-запроса из PHP

<?php
require 'vendor/autoload.php';

use GuzzleHttp\Client;

$client = new Client(['base_uri' => 'https://countries.trevorblades.com/']);

$query = '
query GetCountry {
    country(code: "RU") {
        name
        capital
        currency
        languages {
            name
        }
    }
}';

$response = $client->post('', [
    'json' => ['query' => $query]
]);

$data = json_decode($response->getBody(), true);
echo "Страна: " . $data['data']['country']['name'] . PHP_EOL;
echo "Столица: " . $data['data']['country']['capital'] . PHP_EOL;
echo "Валюта: " . $data['data']['country']['currency'] . PHP_EOL;
echo "Языки: ";
foreach ($data['data']['country']['languages'] as $lang) {
    echo $lang['name'] . " ";
}
?>

Обратите внимание: мы получили ровно те поля, которые запросили. Никакого лишнего веса. Это особенно полезно для мобильных приложений с медленным интернетом.

Строим GraphQL-сервер на PHP

Чтобы не просто потреблять, но и создавать GraphQL API, используем ту же библиотеку. Вот минимальный сценарий:

<?php
use GraphQL\GraphQL;
use GraphQL\Type\Schema;
use GraphQL\Type\Definition\ObjectType;
use GraphQL\Type\Definition\Type;

// Определяем тип "User"
$userType = new ObjectType([
    'name' => 'User',
    'fields' => [
        'id' => Type::int(),
        'name' => Type::string(),
        'email' => Type::string(),
    ]
]);

// Корневой запрос
$queryType = new ObjectType([
    'name' => 'Query',
    'fields' => [
        'user' => [
            'type' => $userType,
            'args' => [
                'id' => Type::nonNull(Type::int())
            ],
            'resolve' => function ($root, $args) {
                // Здесь — запрос к БД
                return ['id' => $args['id'], 'name' => 'Иван', 'email' => 'ivan@example.com'];
            }
        ]
    ]
]);

$schema = new Schema(['query' => $queryType]);

// Обработка запроса
$rawInput = json_decode(file_get_contents('php://input'), true);
$result = GraphQL::executeQuery($schema, $rawInput['query']);
echo json_encode($result->toArray());
?>

GraphQL даёт мощь, но требует дисциплины: нужно правильно проектировать схемы и думать о безопасности (лимиты глубины запроса, авторизация).

gRPC на PHP: скорость на грани возможного

gRPC — это не REST, не GraphQL. Это протокол на основе HTTP/2 и Protocol Buffers (protobuf). Данные передаются в бинарном формате, что делает gRPC невероятно быстрым. Идеально для микросервисов и real-time систем.

Почему gRPC не так популярен в PHP?

  • Сложность настройки: нужно компилировать .proto файлы.
  • Ограничения: HTTP/2 требует SSL/TLS, не все хостинги поддерживают.
  • Но если нужно — оно того стоит: скорость передачи данных в 5-10 раз выше, чем JSON.

Пример gRPC-клиента на PHP

Сначала установите расширение: pecl install grpc и библиотеку composer require grpc/

Блоги

Рекомендаций по книгам