Если в проекте необходимо обратиться к сторонним сервисам или библиотекам, получить контент сразу с нескольких сайтов или распарсить сайт, предварительно получив его cookie, тогда для этого как нельзя лучше подойдет библиотека Guzzle.

Стоит упомянуть, что в PHP для этого уже есть расширение cURL, которое позволяет взаимодействовать с серверами по различным протоколам, посылать запросы, закачивать файлы. Guzzle по умолчанию использует это расширение, если cURL не установлен, Guzzle позволяет заменить HTTP обработчик.

Устанавливается Guzzle через composer. В файле composer.json добавляем в зависимости библиотеку:

{
    "name": "project name",
    "require": {
        "guzzlehttp/guzzle": "6.*"
    }
}

Сохраняем файл и выполняем команду composer install.

Теперь, после загрузки библиотеки, можно ее инициализировать:

require_once 'vendor/autoload.php';

use GuzzleHttp\Client;

/** @var $client Client */
$client = new Client('http://site.ru');

При инициализации мы передаем адрес домена, к которому хотим подключиться. Далее выбираем тип запроса и отправляем его:

require_once 'vendor/autoload.php';

use GuzzleHttp\Client;

/** @var $client Client */
$client = new Client('http://site.ru');

/** @var $request \GuzzleHttp\Psr7\Request */
$request = $client->get('/api?param=test');

/** @var $response \GuzzleHttp\Psr7\Response */
$response = $request->send();

В приведенном выше коде мы отправили GET запрос по адресу http://site.ru/api?param=test.

Тип запроса соответствует названиям метода. Например, для GET - это будет $client→get(), для POST - $client→post(), для PUT - $client→put() и так далее.

Но, ведь после отправки нам нужен ответ от сервера, не так ли? Его можно получить методом $response→getBody(). А методом $response→getStatusCode() - код ответа сервера:

/** @var $response Response */
$response = $request->send();

if ($response->getStatusCode() === 200)
{
    $body = $response->getBody();
}

$response→getBody() возвращает поток. Чтобы вывести содержимое в виде строки, нужно использовать метод $body→getContents(). Также можно прочитать побайтово через метод $body→read(). А вот метод $body→seek() переводит указатель на нужную позицию в потоке. Например:

/** @var $response Response */
$response = $request->send();

if ($response->getStatusCode() === 200)
{
    $body = $response->getBody();

    if ($body->read(5) == '<?xml')
    {
        echo 'Файл размечен как xml';
    }
    $body->seek(0); // вернет указатель в начало

    echo $body->getContents(); // выведет результат запроса в строку 
}

Подводя итоги, хочу сказать, что эта небольшая демонстрация только верхушка айсберга и того, на что способен Guzzle. Структурированная система плагинов, запросов и механизмов обработки ответа делает его гибким HTTP клиентом для PHP.