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ų.
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();
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,
]
]))]);
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'
]
]
]);
Reikia nurodyti kelią diske iki CA rinkinio, kurį "Guzzle" naudoja partnerio sertifikatui patikrinti. Žr. verify.
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
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]);
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);