Оглавление

Есть ли в Guzzle cURL?

Нет. Guzzle может использовать любой обработчик HTTP для отправки запросов. Это означает, что Guzzle можно использовать с cURL, потоковой оберткой PHP, сокетами и неблокирующими библиотеками, такими как React. Вам просто нужно настроить HTTP-обработчик, чтобы использовать другой метод отправки запросов.

Заметка

Guzzle исторически использовал только cURL для отправки HTTP-запросов. CURL - замечательный HTTP-клиент (возможно лучший), и Guzzle будет продолжать использовать его по умолчанию, когда он доступен. Это редко, но некоторые разработчики не имеют cURL, установленного на их системах, или сталкиваются с проблемами конкретной версии. Позволяя swappable обработчикам HTTP, Guzzle теперь гораздо более настраиваемым и способным адаптироваться под нужды большего числа разработчиков.

Может ли Guzzle отправлять асинхронные запросы?

Да. Вы можете использовать requestAsync, sendAsync, getAsync, headAsync, putAsync, postAsync, deleteAsync, а также patchAsync методы клиента для отправки асинхронного запроса. Клиент вернет объект GuzzleHttp\Promise\PromiseInterface. You can chain then functions off of the promise. Вы можете связать с помощью метода  then с обещанием.

$promise = $client->requestAsync('GET', 'http://httpbin.org/get');
$promise->then(function ($response) {
    echo 'Got a response! ' . $response->getStatusCode();
});

Вы можете принудительно завершить асинхронный ответ, используя метод wait() возвращаемого обещания.

$promise = $client->requestAsync('GET', 'http://httpbin.org/get');
$response = $promise->wait();

Как я могу добавить пользовательские опции cURL?

cURL предлагает огромное количество настраиваемых параметров. В то время как Guzzle нормализует многие из этих параметров в разных обработчиках, бывают ситуации, когда вам нужно установить собственные параметры cURL. Это может быть выполнено путем передачи ассоциативного массива параметров cURL в ключе curl запроса.

Например, предположим, что вам нужно настроить исходящий сетевой интерфейс, используемый с клиентом.

$client->request('GET', '/', [
    'curl' => [
        CURLOPT_INTERFACE => 'xxx.xxx.xxx.xxx'
    ]
]);

Как добавить параметры контекстного потока?

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

Например, предположим, что вам нужно настроить исходящий сетевой интерфейс, используемый с клиентом, и разрешить самозаверяющие сертификаты.

$client->request('GET', '/', [
    'stream' => true,
    'stream_context' => [
        'ssl' => [
            'allow_self_signed' => true
        ],
        'socket' => [
            'bindto' => 'xxx.xxx.xxx.xxx'
        ]
    ]
]);

Почему я получаю ошибку подтверждения SSL?

Вы должны указать путь на диске для пакета CA, используемого Guzzle для проверки сертификата партнера. См. Подтверждение.

Что такое ошибка вложения функции Maximum?

Maximum function nesting level of '100' reached, aborting (Достигнут максимальный уровень вложенности функции '100', прервано)

Вы можете столкнуться с этой ошибкой, если у вас установлено расширение XDebug, и вы выполняете много запросов в обратных вызовах. Это сообщение об ошибке приходит специально от расширения XDebug. Сам PHP не имеет предела вложенности функции. Измените этот параметр в своем php.ini, чтобы увеличить лимит:

xdebug.max_nesting_level = 1000

Почему я получаю сообщение об ошибке 417?

Это может произойти по нескольким причинам, но если вы отправляете запросы PUT, POST или PATCH с помощью заголовка Expect: 100-Continue, сервер, который не поддерживает этот заголовок, вернет ответ 417. Вы можете обойти это, установив опцию запроса expect в false:

$client = new GuzzleHttp\Client();

// Отключить заголовок ожидания для одного запроса
$response = $client->request('PUT', '/', ['expect' => false]);

// Отключить заголовок ожидания для всех клиентских запросов
$client = new GuzzleHttp\Client(['expect' => false]);

Оглавление