Введение: 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/