Nu. Guzzle poate utiliza orice gestionar HTTP pentru a trimite cereri. Acest lucru înseamnă că Guzzle poate fi utilizat cu cURL, cu înfășurătorul de fluxuri PHP, cu socket-uri și cu biblioteci care nu blochează. cum ar fi React. Trebuie doar să configurați un gestionar HTTP pentru a utiliza o metodă diferită de trimitere a cererilor.
Notă
Guzzle a folosit în mod istoric doar cURL pentru a trimite cereri HTTP. cURL este un client HTTP uimitor (fără îndoială cel mai bun), iar Guzzle va continua să utilizeze în mod implicit atunci când va fi disponibil. Este rar, dar unii dezvoltatori nu au cURL instalat pe sistemele lor sau se confruntă cu probleme specifice versiunii. Permițând gestionari HTTP interschimbabili, Guzzle este acum mult mai ușor de personalizat și capabil să se adapteze pentru a se potrivi nevoilor mai multor dezvoltatori.
Da. Puteți utiliza requestAsync
, sendAsync
, getAsync
,
headAsync
, putAsync
, postAsync
, deleteAsync
, și patchAsync
ale unui client pentru a trimite o cerere asincronă. Clientul va returna un
obiect GuzzleHttp\Promise\PromiseInterface
. Puteți înlănțui then
de pe promisiune.
$promise = $client->requestAsync('GET', 'http://httpbin.org/get');
$promise->then(function ($response) {
echo 'Got a response! ' . $response->getStatusCode();
});
Puteți forța un răspuns asincron să se finalizeze folosind metoda wait()
a promisiunii returnate.
$promise = $client->requestAsync('GET', 'http://httpbin.org/get');
$response = $promise->wait();
cURL oferă un număr foarte mare de opțiuni personalizabile. În timp ce Guzzle normalizează multe dintre aceste opțiuni între diferiți gestionari, există există momente în care trebuie să setați opțiuni cURL personalizate. Acest lucru poate fi realizat prin transmiterea unui tablou asociativ de setări cURL în cheia curl a unei cerere.
De exemplu, să spunem că trebuie să personalizați interfața de rețea de ieșire utilizată cu un client.
$client->request('GET', '/', [
'curl' => [
CURLOPT_INTERFACE => 'xxx.xxx.xxx.xxx'
]
]);
Dacă utilizați cereri asincrone cu cURL multi handler și doriți să le modificați,
se pot specifica opțiuni suplimentare sub forma unei matrice asociative în fișierul
options cheie a constructorului 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,
]
]))]);
Puteți trece opțiuni personalizate de context de flux utilizând cheia stream_context a opțiunii de cerere. Cheia stream_context este o matrice asociativă în care fiecare cheie este un transport PHP, iar fiecare valoare este o matrice asociativă de opțiuni de transport.
De exemplu, să spunem că trebuie să personalizați interfața de rețea de ieșire utilizată cu un client și să permiteți certificate autofirmate.
$client->request('GET', '/', [
'stream' => true,
'stream_context' => [
'ssl' => [
'allow_self_signed' => true
],
'socket' => [
'bindto' => 'xxx.xxx.xxx.xxx'
]
]
]);
Trebuie să specificați calea de acces pe disc către pachetul CA utilizat de Guzzle pentru verificarea certificatului omologului. Consultați verify.
Maximum function nesting level of '100' reached, aborting
Ați putea întâmpina această eroare dacă aveți extensia XDebug instalată și executați o mulțime de cereri în callback-uri. Acest mesaj de eroare apare în mod special de la extensia XDebug. PHP în sine nu are o funcție limită de anvelopare a funcțiilor. Modificați această setare în php.ini pentru a crește limita:
xdebug.max_nesting_level = 1000
Acest lucru se poate întâmpla din mai multe motive, dar dacă trimiteți PUT, POST, sau
PATCH cu un antet Expect: 100-Continue
, un server care nu
acceptă acest antet va returna un răspuns 417. Puteți rezolva această problemă prin
setarea opțiunii de cerere expect
la 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]);
Puteți activa urmărirea URI-urilor redirecționate și a codurilor de stare prin intermediul parametrului
track_redirects. Fiecare URI redirecționat și fiecare cod de stare vor fi stocate în fișierul
X-Guzzle-Redirect-History
și în X-Guzzle-Redirect-Status-History
respectiv header.
URI-ul cererii inițiale și codul de stare final vor fi excluse din rezultate. Având în vedere acest lucru, ar trebui să puteți urmări cu ușurință calea completă de redirecționare a unei cereri.
De exemplu, să spunem că trebuie să urmăriți redirecționările și să furnizați ambele rezultate împreună într-un singur raport:
// 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);