Внимание! Guzzle!   это продвинутый HTTP клиент для PHP

Guzzle — находится в активной разработке и на данный момент явлется трендовым http-клиентом на phph. За прошедший год две старших версии. Версия 4.0.0 вышла в марте 2014, а май 2015 принёс релиз версии 6.0.0. Переход между ними может вызвать определённые сложности, т.к. разработчики в каждом релизе меняют пространство имён и некоторые принципы работы.

Зачем он нужен этот  Guzzle?
Ежели вам вдруг вздумалось,  распарсить какой-нибудь сайт и для этого вам нужно получить его HTML контент. Можно было бы использовать простую  PHP функцию file_get_contents().

Ну а что, если сайт нет так уж прост и  для начала нужно получить cookie с сайта, чтобы добраться до нужной страницы, или сделать сложные манипуляции с формами, отправив post запрос и, например, приложив при этом клиентский ssl сертификат?

Или вы хотите получать контент сразу с 50 сайтов параллельно и многопоточно? Guzzle решит эти вопросы совершенно бесплатно в форме приятного и удобного программного интерфейса.

Что бы подключить Guzzle, надобно через командную строку или какой-нибудь терминал, например как beget.ru

Вписать туда  пару строк, первая чтобы установить composer,

# Install Composer
curl -sS https://getcomposer.org/installer | php

вторая строка установить Guzzle.:

php composer.phar require guzzlehttp/guzzle:~6.0

А дальше начинаем уже на php. Подключаем автозагрузку

include_once ('vendor/autoload.php');

use GuzzleHttp\Client; // заюзали клиента

$client = new Client(); // создали новый класс

$response = $client->request('GET', $url); // 

$body = $response->getBody(true);

print_r(get_class_methods($body));

//echo $body->getContents();

if
($response->hasHeader('Content-Length')) {
echo "It exists";
}

Ориентация на PSR-7 повлекла за собой большой внутренний рефакторинг. Поскольку Request/Response объекты стали неизменяемыми, старая система с событиями и подписчиками была заменена на систему middleware.

Небольшой пример: раньше у нас был emitter с методом on, и мы могли подписаться на событие before, указав свою функцию-обработчик. А внутри этой функции можно было поменять объект запроса Request, например, добавить какие-то http заголовки. Теперь объект Request неизменяемый, как завещал нам стандарт PSR-7. И вся система с событиями тоже канула в лету.

Вместо этого в версии 6 мы добавляем наш before обработчик (которых, кстати, может быть несколько) в специальный стек хэндлеров. Функции из этого стека будут вызваны перед отправкой сообщения, при этом каждая функция принимает в качестве параметра объект Request и должна вернуть объект Request (возможно, как-то модифицированный, если того требует наша бизнес-логика). Возвращённый объект Request пойдёт на вход следующей функции и так по цепочке. Это и есть система middleware.

Запросы

На выходе ассоциативный масив Associative array значения строки запроса или значения строки добавленного в запросе.

Тип array или  string

По умолчанию None

Константа GuzzleHttp\RequestOptions::QUERY

// Send a GET request to /get?foo=bar
$client->request('GET' , '/get' , [ 'query' => [ 'foo' => 'bar' ]]);

Query strings specified in the query option will overwrite all query string values supplied in the URI of a request.

// Send a GET request to /get?foo=bar
$client->request('GET' , '/get?abc=123' , [ 'query' => [ 'foo' => 'bar' ]]);
 

Headers

 Ассоциативный массив заголовков для добавления в запрос. Каждый ключ - это имя заголовка, и каждое значение представляет собой строку или массив строк, представляющих значения полей заголовка.
Тип: array;
По умолчанию:None;
Constant: GuzzleHttp\RequestOptions::HEADERS
 
$client->request('GET', '/get', [
    'headers' => [
        'User-Agent' => 'Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 6.1)',
        'Accept'     => 'application/json',
        'X-Foo'      => ['Bar', 'Baz']
    ]
]);
 
Заголовки могут добавляться в качестве параметров по умолчанию при создании клиента. Когда заголовки используются в качестве параметров по умолчанию, они применяются только в том случае, если создаваемый запрос еще не содержит определенный заголовок. Это включает запросы, переданные клиенту в методах и запросах send () и sendAsync (), созданных клиентом (например, request () и requestAsync ()).