FAQ

Vai Guzzle ir nepieciešams cURL?

Nē. Guzzle var izmantot jebkuru HTTP apstrādātāju, lai nosūtītu pieprasījumus. Tas nozīmē, ka Guzzle var izmantot kopā ar cURL, PHP plūsmas apvalku, ligzdām un nebloķējošām bibliotēkām. piemēram, React. Jums tikai jākonfigurē HTTP apstrādātājs lai izmantotu citu pieprasījumu nosūtīšanas metodi.

Piezīme

Guzzle vēsturiski ir izmantojis tikai cURL, lai nosūtītu HTTP pieprasījumus. cURL ir ir lielisks HTTP klients (iespējams, labākais), un Guzzle turpinās izmantot pēc noklusējuma, kad tas būs pieejams. Tas notiek reti, bet daži izstrādātāji to nedara. savās sistēmās ir instalēts cURL vai arī saskaras ar problēmām, kas saistītas ar konkrētu versiju. Ļaujot nomaināmus HTTP apstrādātājus, Guzzle tagad ir daudz pielāgojamāks. un to var pielāgot, lai tas atbilstu vairāk izstrādātāju vajadzībām.

Vai Guzzle var nosūtīt asinhronus pieprasījumus?

Jā. Jūs varat izmantot requestAsync, sendAsync, getAsync, headAsync, putAsync, postAsync, deleteAsync un patchAsync. klienta metodes, lai nosūtītu asinhrono pieprasījumu. Klients atgriezīs GuzzleHttp\Promise\PromiseInterface objektu. Jūs varat ķēdes veidā then funkcijas no solījuma.

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

Jūs varat piespiest asinhrono atbildi pabeigt, izmantojot wait() atdotā solījuma metodi.

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

Kā pievienot pielāgotas cURL opcijas?

cURL piedāvā ļoti daudz pielāgojamu iespēju. Lai gan Guzzle normalizē daudzas no šīm opcijām dažādiem apstrādātājiem, ir ir gadījumi, kad nepieciešams iestatīt pielāgotas cURL opcijas. To var izdarīt nododot asociatīvu cURL iestatījumu masīvu curl atslēgas curl atslēgā. pieprasījumā.

Piemēram, pieņemsim, ka nepieciešams pielāgot izejošo tīkla interfeisu, kas tiek izmantots kopā ar klientu.

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

Ja izmantojat asinhronus pieprasījumus ar cURL multi apstrādātāju un vēlaties to pielāgot, papildu opcijas var norādīt kā asociatīvu masīvu options atslēgā CurlMultiHandler konstruktorā.

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

Kā pievienot pielāgotas plūsmas konteksta opcijas?

Varat nodot pielāgotas plūsmas konteksta opcijas izmantojot pieprasījuma opcijas stream_context atslēgu. stream_context masīvs ir asociatīvs masīvs, kurā katra atslēga ir PHP transports, un katra vērtība ir transporta opciju asociatīvs masīvs.

Piemēram, pieņemsim, ka jums ir jāpielāgo izejošais tīkla interfeiss, kas tiek izmantots kopā ar klientu, un jāatļauj pašparakstīti sertifikāti.

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

Kāpēc man parādās SSL verifikācijas kļūda?

Jānorāda ceļš uz diska līdz CA kopumam, ko Guzzle izmanto, lai pārbaudītu līdzinieku sertifikātu. Skatīt verify.

Kas ir šī Maksimālā funkciju ligzdošanas kļūda?

Maximum function nesting level of '100' reached, aborting

Šī kļūda var rasties, ja ir instalēts XDebug paplašinājums un izpildāt daudz pieprasījumu ar atpakaļsaukumiem. Šis kļūdas ziņojums parādās tieši no XDebug paplašinājuma. PHP nav funkcijas funkciju ligzdošanas ierobežojums. Mainiet šo iestatījumu savā php.ini, lai palielinātu ierobežojumu:

xdebug.max_nesting_level = 1000

Kāpēc saņemu 417 kļūdas atbildi?

Tas var notikt vairāku iemeslu dēļ, bet, ja sūtāt PUT, POST vai PATCH pieprasījumus ar Expect: 100-Continue galveni, serveris, kas nav neatbalsta šo galveni, atgriezīs 417 atbildi. To var apiet, izmantojot iestatot sagaidīt pieprasījuma opciju uz 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]);

Kā izsekot novirzītos pieprasījumus?

Varat iespējot novirzīto URI un statusa kodu izsekošanu, izmantojot track_redirects opciju. Katrs novirzītais URI un statusa kods tiks saglabāts opcijā X-Guzzle-Redirect-History un X-Guzzle-Redirect-Status-History. attiecīgi galvenes.

Sākotnējā pieprasījuma URI un galīgais statusa kods netiks iekļauts rezultātos. Paturot to prātā, jums vajadzētu būt iespējai viegli izsekot pieprasījuma pilnu novirzīšanas ceļu.

Piemēram, pieņemsim, ka jums ir nepieciešams izsekot novirzīšanu un sniegt abus rezultātus kopā vienā pārskatā:

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