Guzzle для PHP: полное руководство с примерами

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

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

Начать курс

Что такое Guzzle и зачем он нужен?

Guzzle — это мощная PHP-библиотека для работы с HTTP-запросами. Она предоставляет удобный интерфейс для отправки HTTP-запросов, обработки ответов, работы с куками, сессиями, асинхронными запросами и многим другим. Если вы работаете с API, парсите веб-страницы или просто взаимодействуете с удалёнными серверами, Guzzle станет вашим незаменимым инструментом.

Основные возможности Guzzle:

  • Поддержка всех HTTP-методов (GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS)
  • Работа с заголовками, телом запроса, параметрами URL
  • Поддержка асинхронных запросов (Promise-based)
  • Автоматическая обработка перенаправлений (редиректов)
  • Работа с куками и сессиями
  • Middleware для расширения функциональности
  • Поддержка PSR-7 (PSR-7 интерфейсы для HTTP-сообщений)
  • Простое тестирование и мокирование

Guzzle используется в таких крупных проектах, как Laravel (встроенный HTTP-клиент), Drupal, Magento и многих других.

Установка

Установка Guzzle осуществляется через Composer — менеджер зависимостей для PHP. Если у вас ещё нет Composer, установите его с официального сайта getcomposer.org.

Выполните команду в терминале в корне вашего проекта:

composer require guzzlehttp/guzzle

После установки подключите автозагрузчик Composer в вашем PHP-файле:

require 'vendor/autoload.php';

Теперь вы готовы к работе с Guzzle.

Быстрый старт

Давайте отправим простой GET-запрос к публичному API и получим данные в формате JSON.

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

use GuzzleHttp\Client;

$client = new Client();
$response = $client->get('https://jsonplaceholder.typicode.com/posts/1');

// Получаем тело ответа
$body = $response->getBody();

// Преобразуем JSON в массив
$data = json_decode($body, true);

echo "Title: " . $data['title'] . "\n";
echo "Body: " . $data['body'] . "\n";
?>

Этот пример показывает, как легко можно получить данные с удалённого сервера. Guzzle автоматически обрабатывает заголовки, статус-коды и тело ответа.

Основные методы и функции

1. get() — GET-запрос

Что делает: Отправляет HTTP GET-запрос к указанному URL. Используется для получения данных.

Параметры:

  • $uri (string) — URL запроса
  • $options (array) — массив опций (заголовки, query-параметры, таймауты и т.д.)

Пример:

<?php
$client = new GuzzleHttp\Client();
$response = $client->get('https://api.github.com/users/octocat', [
    'headers' => [
        'Accept' => 'application/json',
        'User-Agent' => 'Guzzle-Demo'
    ],
    'query' => [
        'page' => 1,
        'per_page' => 10
    ]
]);

echo $response->getStatusCode(); // 200
echo $response->getBody();
?>

2. post() — POST-запрос

Что делает: Отправляет POST-запрос. Используется для создания новых ресурсов или отправки данных на сервер.

Параметры:

  • $uri (string) — URL запроса
  • $options (array) — массив опций (body, form_params, json, multipart и т.д.)

Пример:

<?php
$client = new GuzzleHttp\Client();
$response = $client->post('https://jsonplaceholder.typicode.com/posts', [
    'json' => [
        'title' => 'Новый пост',
        'body' => 'Содержимое поста',
        'userId' => 1
    ]
]);

echo $response->getStatusCode(); // 201
$data = json_decode($response->getBody(), true);
print_r($data);
?>

3. put() — PUT-запрос

Что делает: Отправляет PUT-запрос для полного обновления ресурса.

Параметры:

  • $uri (string) — URL запроса
  • $options (array) — массив опций

Пример:

<?php
$client = new GuzzleHttp\Client();
$response = $client->put('https://jsonplaceholder.typicode.com/posts/1', [
    'json' => [
        'id' => 1,
        'title' => 'Обновлённый заголовок',
        'body' => 'Новое содержимое',
        'userId' => 1
    ]
]);

echo $response->getStatusCode(); // 200
?>

4. patch() — PATCH-запрос

Что делает: Отправляет PATCH-запрос для частичного обновления ресурса.

Параметры:

  • $uri (string) — URL запроса
  • $options (array) — массив опций

Пример:

<?php
$client = new GuzzleHttp\Client();
$response = $client->patch('https://jsonplaceholder.typicode.com/posts/1', [
    'json' => [
        'title' => 'Только заголовок изменён'
    ]
]);

echo $response->getStatusCode(); // 200
?>

5. delete() — DELETE-запрос

Что делает: Отправляет DELETE-запрос для удаления ресурса.

Параметры:

  • $uri (string) — URL запроса
  • $options (array) — массив опций

Пример:

<?php
$client = new GuzzleHttp\Client();
$response = $client->delete('https://jsonplaceholder.typicode.com/posts/1');

echo $response->getStatusCode(); // 200
?>

6. head() — HEAD-запрос

Что делает: Отправляет HEAD-запрос, который аналогичен GET, но возвращает только заголовки без тела ответа. Полезно для проверки существования ресурса или получения метаданных.

Параметры:

  • $uri (string) — URL запроса
  • $options (array) — массив опций

Пример:

<?php
$client = new GuzzleHttp\Client();
$response = $client->head('https://jsonplaceholder.typicode.com/posts/1');

echo $response->getStatusCode(); // 200
echo $response->getHeaderLine('Content-Type'); // application/json; charset=utf-8
?>

7. options() — OPTIONS-запрос

Что делает: Отправляет OPTIONS-запрос для получения информации о поддерживаемых методах и опциях сервера.

Параметры:

  • $uri (string) — URL запроса
  • $options (array) — массив опций

Пример:

<?php
$client = new GuzzleHttp\Client();
$response = $client->options('https://jsonplaceholder.typicode.com/posts');

echo $response->getHeaderLine('Allow'); // GET,HEAD,PUT,PATCH,POST,DELETE
?>

8. send() — Отправка произвольного запроса

Что делает: Позволяет отправить запрос с произвольным методом и полным контролем над всеми параметрами.

Параметры:

  • $request (Psr\Http\Message\RequestInterface) — объект запроса
  • $options (array) — массив опций

Пример:

<?php
use GuzzleHttp\Psr7\Request;

$client = new GuzzleHttp\Client();
$request = new Request('GET', 'https://api.github.com/users/octocat');
$response = $client->send($request, [
    'headers' => [
        'Accept' => 'application/json'
    ]
]);

echo $response->getBody();
?>

9. request() — Универсальный метод

Что делает: Позволяет отправить запрос любого HTTP-метода, передав его название как строку.

Параметры:

  • $method (string) — HTTP метод (GET, POST, PUT и т.д.)
  • $uri (string) — URL запроса
  • $options (array) — массив опций

Пример:

<?php
$client = new GuzzleHttp\Client();
$response = $client->request('GET', 'https://jsonplaceholder.typicode.com/posts/1', [
    'headers' => [
        'Accept' => 'application/json'
    ]
]);

echo $response->getBody();
?>

10. getAsync() — Асинхронный GET-запрос

Что делает: Отправляет асинхронный GET-запрос, который не блокирует выполнение скрипта. Возвращает Promise, который можно разрешить позже.

Параметры:

  • $uri (string) — URL запроса
  • $options (array) — массив опций

Пример:

<?php
$client = new GuzzleHttp\Client();
$promise = $client->getAsync('https://jsonplaceholder.typicode.com/posts/1');

// Выполняем другие задачи...

$response = $promise->wait();
echo $response->getBody();
?>

Реальный практический пример

Рассмотрим реальный сценарий: создание простого клиента для работы с GitHub API. Мы будем получать информацию о пользователе, список его репозиториев и создавать новый issue.

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

use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;

class GitHubClient
{
    private $client;
    private $token;

    public function __construct($token = null)
    {
        $this->token = $token;
        $this->client = new Client([
            'base_uri' => 'https://api.github.com/',
            'headers' => [
                'Accept' => 'application/vnd.github.v3+json',
                'User-Agent' => 'MyApp/1.0'
            ]
        ]);
    }

    public function getUser($username)
    {
        try {
            $response = $this->client->get("users/{$username}");
            return json_decode($response->getBody(), true);
        } catch (RequestException $e) {
            return ['error' =&                    

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