FAQ

Kräver Guzzle cURL?

Nej, Guzzle kan använda vilken HTTP-hanterare som helst för att skicka begäranden. Detta innebär att Guzzle kan användas med cURL, PHP:s stream wrapper, sockets och icke-blockerande bibliotek. som React. Du behöver bara konfigurera en HTTP-hanterare för att använda en annan metod för att skicka förfrågningar.

Obs

Guzzle har historiskt sett endast använt cURL för att skicka HTTP-begäranden. cURL är en en fantastisk HTTP-klient (utan tvekan den bästa), och Guzzle kommer att fortsätta att använda den som standard när den är tillgänglig. Det är sällsynt, men vissa utvecklare använder inte har cURL installerat på sina system eller stöter på versionsspecifika problem. Genom att tillåta utbytbara HTTP-hanterare är Guzzle nu mycket mer anpassningsbart. och kan anpassas för att passa behoven hos fler utvecklare.

Kan Guzzle skicka asynkrona förfrågningar?

Ja, du kan använda requestAsync, sendAsync, getAsync, headAsync, putAsync, postAsync, deleteAsync och patchAsync. metoder för en klient för att skicka en asynkron begäran. Klienten returnerar en GuzzleHttp\Promise\PromiseInterface objekt. Du kan kedja then funktioner från löftet.

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

Du kan tvinga ett asynkront svar att slutföras med hjälp av wait() metoden för det returnerade löftet.

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

Hur kan jag lägga till anpassade cURL-alternativ?

cURL erbjuder ett stort antal anpassningsbara alternativ. Även om Guzzle normaliserar många av dessa alternativ mellan olika handläggare finns det finns det tillfällen då du behöver ställa in anpassade cURL-alternativ. Detta kan åstadkommas genom att skicka en associativ array av cURL-inställningar i curl-nyckeln i en begäran.

Låt oss till exempel säga att du behöver anpassa det utgående nätverksgränssnittet som används med en klient.

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

Om du använder asynkrona förfrågningar med cURL multihandler och vill justera den, kan du ange ytterligare alternativ som en associerande array i options i CurlMultiHandler konstruktören.

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

Hur kan jag lägga till anpassade alternativ för strömkontext?

Du kan skicka anpassade strömkontextalternativ med hjälp av nyckeln stream_context i begäranalternativet. Den stream_context array är en associativ array där varje nyckel är en PHP-transport och varje värde är en associativ matris med transportalternativ.

Låt oss till exempel säga att du behöver anpassa det utgående nätverksgränssnittet som används med en klient och tillåta självsignerade certifikat.

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

Varför får jag ett SSL-verifieringsfel?

Du måste ange sökvägen på disken till det certifikatutfärdarpaket som Guzzle använder för att verifiera peercertifikatet. Se verify.

Vad är det här felet med maximal funktionshäckning?

Maximum function nesting level of '100' reached, aborting

Du kan stöta på detta fel om du har XDebug-tillägget installerat och du utför många förfrågningar i callbacks. Detta felmeddelande kommer specifikt från XDebug-tillägget. PHP har ingen funktion begränsning. Ändra den här inställningen i din php.ini för att öka gränsen:

xdebug.max_nesting_level = 1000

Varför får jag ett 417-felsvar?

Detta kan inträffa av flera skäl, men om du skickar PUT, POST eller PATCH-förfrågningar med en Expect: 100-Continue -huvud, kan en server som inte har en har stöd för denna rubrik kommer att returnera ett 417-svar. Du kan kringgå detta genom att ställa in förfrågningsalternativet expect till 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]);

Hur kan jag spåra omdirigerade förfrågningar?

Du kan aktivera spårning av omdirigerade URI:er och statuskoder med hjälp av track_redirects. Varje omdirigerad URI och statuskod lagras i X-Guzzle-Redirect-History och X-Guzzle-Redirect-Status-History. respektive.

Den ursprungliga begäranens URI och den slutliga statuskoden kommer att uteslutas från resultaten. Med detta i åtanke bör du enkelt kunna spåra en begärelses fullständiga omdirigeringssökväg.

Låt oss till exempel säga att du behöver spåra omdirigeringar och ge båda resultaten tillsammans i en enda rapport:

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