DUK

Ar "Guzzle" reikalauja cURL?

Ne. "Guzzle" užklausoms siųsti gali naudoti bet kurį HTTP tvarkytuvą. Tai reiškia, kad Guzzle galima naudoti su cURL, PHP srauto apvyniotuvu, lizdais ir neblokuojančiomis bibliotekomis. pavyzdžiui, React. Tereikia sukonfigūruoti HTTP tvarkyklę naudoti kitokį užklausų siuntimo būdą.

Pastaba

"Guzzle" istoriškai naudojo tik cURL HTTP užklausoms siųsti. cURL yra nuostabus HTTP klientas (turbūt geriausias), ir "Guzzle" ir toliau naudos pagal nutylėjimą, kai jis bus prieinamas. Tai pasitaiko retai, bet kai kurie kūrėjai ne savo sistemose yra įdiegę cURL arba susiduria su konkrečios versijos problemomis. Leidžiant keisti HTTP tvarkykles, "Guzzle" dabar yra daug lengviau pritaikoma ir gali prisitaikyti prie daugiau kūrėjų poreikių.

Ar "Guzzle" gali siųsti asinchronines užklausas?

Taip. Galite naudoti requestAsync, sendAsync, getAsync, headAsync, putAsync, postAsync, deleteAsync ir patchAsync kliento metodų, skirtų asinchroninei užklausai siųsti. Klientas grąžins GuzzleHttp\Promise\PromiseInterface objektą. Galite grandininiu būdu then funkcijų, susijusių su pažadu.

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

Galite priversti užbaigti asinchroninį atsakymą naudodami wait() grąžinto pažado metodą.

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

Kaip pridėti pasirinktines cURL parinktis?

cURL siūlo daugybę pritaikomų parinkčių. Nors "Guzzle" daugelį šių parinkčių normalizuoja įvairiose tvarkyklėse, yra kartais reikia nustatyti pasirinktines cURL parinktis. Tai galima padaryti perduodant asocijuotą cURL nustatymų masyvą curl rakte užklausą.

Pavyzdžiui, tarkime, reikia pritaikyti su klientu naudojamą išeinančią tinklo sąsają.

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

Jei naudojate asinchronines užklausas su cURL multi tvarkytuvu ir norite jį patobulinti, papildomas parinktis galima nurodyti kaip asocijuotą masyvą options raktą CurlMultiHandler konstruktoriuje.

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

Kaip pridėti pasirinktines srauto konteksto parinktis?

Galite perduoti pasirinktines srauto konteksto parinktis naudodami stream_context užklausos parinkties raktą. stream_context masyvas yra asociatyvus masyvas, kuriame kiekvienas raktas yra PHP transportas, o kiekviena reikšmė yra asocijuotas transporto parinkčių masyvas.

Tarkime, reikia pritaikyti su klientu naudojamą išeinančią tinklo sąsają ir leisti naudoti savarankiškai pasirašytus sertifikatus.

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

Kodėl gaunu SSL tikrinimo klaidą?

Reikia nurodyti kelią diske iki CA rinkinio, kurį "Guzzle" naudoja partnerio sertifikatui patikrinti. Žr. verify.

Kas tai yra maksimalios funkcijos įterpimo klaida?

Maximum function nesting level of '100' reached, aborting

Su šia klaida galite susidurti, jei turite įdiegtą XDebug plėtinį ir vykdote daug užklausų atgaliniais skambučiais. Šis klaidos pranešimas gaunamas būtent iš XDebug plėtinio. Pačioje PHP nėra funkcijos įterpimo apribojimo. Pakeiskite šį nustatymą savo php.ini, kad padidintumėte ribą:

xdebug.max_nesting_level = 1000

Kodėl gaunu 417 klaidos atsakymą?

Taip gali nutikti dėl įvairių priežasčių, tačiau jei siunčiate PUT, POST arba PATCH užklausas su Expect: 100-Continue antraštėmis, serveris, kuris neturi nepalaiko šios antraštės, grąžins 417 atsakymą. Tai galima apeiti nustatydami expect užklausos parinktį į 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]);

Kaip stebėti nukreiptas užklausas?

Galite įjungti nukreiptų URI ir būsenos kodų stebėjimą naudodami track_redirects parinktį. Kiekvienas nukreiptas URI ir būsenos kodas bus saugomas X-Guzzle-Redirect-History ir X-Guzzle-Redirect-Status-History. atitinkamai antraštė.

Pradinės užklausos URI ir galutinis būsenos kodas į rezultatus nebus įtraukti. Atsižvelgdami į tai, turėtumėte lengvai atsekti visą užklausos nukreipimo kelią.

Pavyzdžiui, tarkime, reikia stebėti nukreipimus ir pateikti abu rezultatus kartu vienoje ataskaitoje:

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