Întrebări frecvente

Are Guzzle nevoie de cURL?

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.

Poate Guzzle să trimită cereri asincrone?

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();

Cum pot adăuga opțiuni cURL personalizate?

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,
    ]
]))]);

Cum pot adăuga opțiuni de context de flux personalizate?

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'
        ]
    ]
]);

De ce primesc o eroare de verificare SSL?

Trebuie să specificați calea de acces pe disc către pachetul CA utilizat de Guzzle pentru verificarea certificatului omologului. Consultați verify.

Ce este această eroare maximă de anvelopare a funcțiilor?

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

De ce primesc un răspuns de eroare 417?

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]);

Cum pot urmări cererile redirecționate?

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);