GYIK

A Guzzle-nek szüksége van cURL-re?

Nem. A Guzzle bármilyen HTTP kezelőt használhat a kérések küldésére. Ez azt jelenti, hogy a Guzzle használható a cURL-lel, a PHP stream wrapperével, a socketekkel és a nem blokkoló könyvtárakkal. mint például a React. Csak egy HTTP kezelőt kell konfigurálnia. hogy más módszert használjon a kérések küldésére.

Megjegyzés:

A Guzzle történelmileg csak a cURL-t használta a HTTP-kérések küldésére. egy csodálatos HTTP kliens (vitathatatlanul a legjobb), és a Guzzle továbbra is a cURLUR-t fogja használni. alapértelmezés szerint használni fogja, ha elérhető lesz. Ritka, de egyes fejlesztők nem a cURL telepítve van a rendszerükön, vagy verzió-specifikus problémákba ütköznek. A cserélhető HTTP kezelők engedélyezésével a Guzzle sokkal jobban testreszabhatóvá vált. és képes alkalmazkodni több fejlesztő igényeihez.

Tud a Guzzle aszinkron kéréseket küldeni?

Igen. Használhatja a requestAsync, sendAsync, getAsync parancsokat, headAsync, putAsync, postAsync, deleteAsync, és patchAsync. metódusok egy kliens aszinkron kérés küldésére. Az ügyfél egy GuzzleHttp\Promise\PromiseInterface objektumot. Láncolhatjuk a then függvényeket az ígéretből.

$promise = $client->requestAsync('GET', 'http://httpbin.org/get');
$promise->then(function ($response) {
    echo 'Got a response! ' . $response->getStatusCode();
});

Az aszinkron válasz befejezését a visszaadott ígéret wait() metódusával kényszerítheti ki.

$promise = $client->requestAsync('GET', 'http://httpbin.org/get');
$response = $promise->wait();

Hogyan adhatok hozzá egyéni cURL-opciókat?

A cURL rengeteg testreszabható opciót kínál. Míg a Guzzle sok ilyen opciót normalizál a különböző kezelők között, addig a vannak olyan esetek, amikor egyéni cURL opciókat kell beállítanunk. Ez megvalósítható a cURL-beállítások asszociatív tömbjének átadásával a curl kulcsban egy request.

Tegyük fel például, hogy testre kell szabni az ügyféllel használt kimenő hálózati interfészt.

$client->request('GET', '/', [
    'curl' => [
        CURLOPT_INTERFACE => 'xxx.xxx.xxx.xxx'
    ]
]);

Ha aszinkron kéréseket használsz a cURL multi handlerrel, és szeretnéd finomítani, további opciókat adhatunk meg asszociatív tömbként a options kulcsában a CurlMultiHandler konstruktorban.

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

Hogyan adhatok hozzá egyéni folyam-kontextus opciókat?

Átadhat egyéni folyam-kontextus beállításokat a kérési opció stream_context kulcsának használatával. Az stream_context tömb egy asszociatív tömb, ahol minden kulcs egy PHP-transzport, és minden érték a szállítási lehetőségek asszociatív tömbje.

Tegyük fel például, hogy testre kell szabni az ügyféllel használt kimenő hálózati interfészt, és engedélyezni kell az önaláírt tanúsítványokat.

$client->request('GET', '/', [
    'stream' => true,
    'stream_context' => [
        'ssl' => [
            'allow_self_signed' => true
        ],
        'socket' => [
            'bindto' => 'xxx.xxx.xxx.xxx'
        ]
    ]
]);

Miért kapok SSL-ellenőrzési hibát?

Meg kell adnia a Guzzle által a társtanúsítvány ellenőrzéséhez használt hitelesítésszolgáltatói csomag lemezen található elérési útvonalát. Lásd verify.

Mi ez a Maximum-function-nesting-error?

Maximum function nesting level of '100' reached, aborting

Ez a hiba akkor fordulhat elő, ha telepítve van az XDebug kiterjesztés és a sok kérést hajt végre a visszahívásokban. Ez a hibaüzenet a következő kifejezetten az XDebug bővítménytől származik. Maga a PHP nem rendelkezik olyan függvénnyel beágyazási korlátja. Módosítsa ezt a beállítást a php.ini fájlban a limit növeléséhez:

xdebug.max_nesting_level = 1000

Miért kapok egy 417-es hibaválaszt?

Ez több okból is előfordulhat, de ha PUT, POST vagy PATCH kéréseket Expect: 100-Continue fejléccel, egy olyan kiszolgáló, amelyik nem nem támogatja ezt a fejlécet, 417-es választ fog visszaküldeni. Ezt megkerülheti a következő módon a expect kérési opciót false értékre állítjuk:

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

Hogyan tudom nyomon követni az átirányított kéréseket?

Az átirányított URI-k és státuszkódok nyomon követését a track_redirects opció segítségével. Minden átirányított URI és státuszkód az alábbiakban kerül tárolásra X-Guzzle-Redirect-History és a X-Guzzle-Redirect-Status-History között. fejlécet.

A kezdeti kérés URI-je és a végső státuszkód nem kerül ki az eredményekből. Ezt szem előtt tartva könnyen nyomon követheti a kérés teljes átirányítási útvonalát.

Tegyük fel például, hogy nyomon kell követnie az átirányításokat, és mindkét eredményt egyetlen jelentésben kell megadnia:

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