Нет. Guzzle может использовать любой HTTP-обработчик для отправки запросов. Это означает, что Guzzle можно использовать с cURL, оберткой потока PHP, сокетами и неблокирующими библиотеками. такими как React. Вам просто нужно настроить HTTP-обработчик для использования другого метода отправки запросов.
Примечание
Guzzle исторически использовал только cURL для отправки HTTP-запросов. cURL - это замечательный HTTP-клиент (возможно, лучший), и Guzzle продолжит его использовать его по умолчанию, когда он будет доступен. Это редкость, но некоторые разработчики не устанавливают cURL на свои системы или сталкиваются с проблемами, связанными с конкретной версией. Благодаря возможности замены HTTP-обработчиков, 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 предлагает огромное количество настраиваемых опций. Хотя 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'
]
]
]);
Вам необходимо указать путь на диске к пакету CA, используемому Guzzle для проверки сертификата peer. Смотрите verify.
Maximum function nesting level of '100' reached, aborting
Вы можете столкнуться с этой ошибкой, если у вас установлено расширение XDebug и вы выполняете много запросов в обратных вызовах. Это сообщение об ошибке приходит именно от расширения XDebug. В самом PHP нет ограничения на количество функций ограничение на вложенность. Измените этот параметр в вашем php.ini, чтобы увеличить лимит:
xdebug.max_nesting_level = 1000
Это может произойти по ряду причин, но если вы отправляете запросы 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);