Não. O Guzzle pode usar qualquer manipulador HTTP para enviar pedidos. Isto significa que o Guzzle pode ser usado com cURL, PHP's stream wrapper, tomadas, e bibliotecas sem bloqueios como Reagir. Só precisa de configurar um manipulador HTTP para utilizar um método diferente de envio de pedidos.
Nota
Historicamente, a Guzzle tem utilizado apenas cURL para enviar pedidos HTTP. cURL é um incrível cliente HTTP (indiscutivelmente o melhor), e Guzzle continuará a usar por defeito, quando está disponível. É raro, mas alguns criadores não têm o cURL instalado nos seus sistemas ou correm com problemas específicos de versão. Ao permitir manipuladores HTTP permutáveis, o Guzzle é agora muito mais personalizável e capaz de se adaptar às necessidades de mais criadores.
Sim. Pode usar o requestAsync
, sendAsync
, getAsync
,
headAsync
, putAsync
, postAsync
, deleteAsync
, e patchAsync
métodos de um cliente para enviar um pedido assíncrono. O cliente devolverá um
GuzzleHttp\Promise\PromiseInterface
object. Pode encadear then
.
funciona fora do âmbito da promessa.
$promise = $client->requestAsync('GET', 'http://httpbin.org/get');
$promise->then(function ($response) {
echo 'Got a response! ' . $response->getStatusCode();
});
Pode forçar uma resposta assíncrona a completar usando o método wait()
método da promessa devolvida.
$promise = $client->requestAsync('GET', 'http://httpbin.org/get');
$response = $promise->wait();
cURL oferece um grande número de opções personalizáveis.
Enquanto o Guzzle normaliza muitas destas opções através de diferentes manipuladores, aí
são alturas em que é necessário definir opções personalizadas de cURL. Isto pode ser realizado
passando um conjunto associativo de definições de cURL na chave
Por exemplo, digamos que é necessário personalizar a interface de saída de rede utilizada com um cliente.
$client->request('GET', '/', [
'curl' => [
CURLOPT_INTERFACE => 'xxx.xxx.xxx.xxx'
]
]);
Se utilizar pedidos assíncronos com o multi-manipulador cURL e quiser afiná-lo,
opções adicionais podem ser especificadas como uma matriz associativa no
options key of the CurlMultiHandler
construtor.
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,
]
]))]);
Pode passar as opções de contexto stream
utilizando a tecla stream_context da opção de pedido. A tecla
Por exemplo, digamos que é necessário personalizar a interface de saída de rede utilizada com um cliente e permitir certificados autoassinados.
$client->request('GET', '/', [
'stream' => true,
'stream_context' => [
'ssl' => [
'allow_self_signed' => true
],
'socket' => [
'bindto' => 'xxx.xxx.xxx.xxx'
]
]
]);
É necessário especificar o caminho no disco para o pacote CA utilizado pela Guzzle para a verificação do certificado do par. Ver verify.
Maximum function nesting level of '100' reached, aborting
Poderá deparar-se com este erro se tiver a extensão XDebug instalada e executa uma série de pedidos em callbacks. Esta mensagem de erro vem especificamente a partir da extensão XDebug. O próprio PHP não tem uma função limite de nidificação. Altere esta configuração no seu php.ini para aumentar o limite:
xdebug.max_nesting_level = 1000
Isto pode ocorrer por várias razões, mas se estiver a enviar PUT, POST, ou
PATCH solicita com um cabeçalho Espere: 100-Continue
, um servidor que não
apoiar este cabeçalho irá devolver uma resposta de 417. Pode contornar isto através de
definir a opção expect
request option to 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]);
Pode permitir o seguimento de URIs redireccionadas e códigos de estado através do
opção X-Guzzle-Redirect-History
e o X-Guzzle-Redirect-Status-History
cabeçalho, respectivamente.
O URI do pedido inicial e o código de estado final serão excluídos dos resultados. Com isto em mente, deverá ser capaz de seguir facilmente o caminho de redireccionamento completo de um pedido.
Por exemplo, digamos que precisa de seguir os redireccionamentos e fornecer ambos os resultados em conjunto num único relatório:
// 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);