FAQ

Требуется ли Guzzle cURL?

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

Примечание

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

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

Да. Вы можете использовать requestAsync, sendAsync, getAsync, headAsync, putAsync, postAsync, deleteAsync, и patchAsync. методы клиента для отправки асинхронного запроса. Клиент вернет GuzzleHttp\Promise\PromiseInterface объект. Вы можете выстраивать цепочки 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'
    ]
]);

Если вы используете асинхронные запросы с мультиобработчиком cURL и хотите настроить его, дополнительные опции могут быть заданы в виде ассоциативного массива в ключе options конструктора CurlMultiHandler.

use GuzzleHttp\Client;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Handler\CurlMultiHandler;

$client = new Client(['handler' => HandlerStack::create(new CurlMultiHandler([
    'options' => [
        CURLMOPT_MAX_TOTAL_CONNECTIONS => 50,
        CURLMOPT_MAX_HOST_CONNECTIONS => 5,
    ]
]))]);

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

Вы можете передавать пользовательские опции контекста потока используя ключ 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 для проверки сертификата peer. Смотрите verify.

Что это за ошибка максимального вложения функций?

Maximum function nesting level of '100' reached, aborting

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

xdebug.max_nesting_level = 1000

Почему я получаю ответ об ошибке 417?

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

$client = new GuzzleHttp\Client();

// Disable the expect header on a single request
$response = $client->request('PUT', '/', ['expect' => false]);

// Disable the expect header on all client requests
$client = new GuzzleHttp\Client(['expect' => false]);

Как я могу отслеживать перенаправленные запросы?

Вы можете включить отслеживание перенаправленных URI и кодов состояния с помощью опции track_redirects. Каждый перенаправленный URI и код состояния будет храниться в файле X-Guzzle-Redirect-History и X-Guzzle-Redirect-Status-History соответственно.

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

Например, допустим, вам нужно отслеживать перенаправления и предоставлять оба результата вместе в одном отчете:

// First you configure Guzzle with redirect tracking and make a request
$client = new Client([
    RequestOptions::ALLOW_REDIRECTS => [
        'max'             => 10,        // allow at most 10 redirects.
        'strict'          => true,      // use "strict" RFC compliant redirects.
        'referer'         => true,      // add a Referer header
        'track_redirects' => true,
    ],
]);
$initialRequest = '/redirect/3'; // Store the request URI for later use
$response = $client->request('GET', $initialRequest); // Make your request

// Retrieve both Redirect History headers
$redirectUriHistory = $response->getHeader('X-Guzzle-Redirect-History')[0]; // retrieve Redirect URI history
$redirectCodeHistory = $response->getHeader('X-Guzzle-Redirect-Status-History')[0]; // retrieve Redirect HTTP Status history

// Add the initial URI requested to the (beginning of) URI history
array_unshift($redirectUriHistory, $initialRequest);

// Add the final HTTP status code to the end of HTTP response history
array_push($redirectCodeHistory, $response->getStatusCode());

// (Optional) Combine the items of each array into a single result set
$fullRedirectReport = [];
foreach ($redirectUriHistory as $key => $value) {
    $fullRedirectReport[$key] = ['location' => $value, 'code' => $redirectCodeHistory[$key]];
}
echo json_encode($fullRedirectReport);