FAQ

Vyžaduje Guzzle cURL?

Nie. Guzzle môže na odosielanie požiadaviek používať ľubovoľnú obsluhu HTTP. To znamená, že Guzzle možno používať s cURL, obalom prúdu PHP, socketmi a neblokujúcimi knižnicami ako napríklad React. Stačí nakonfigurovať obsluhu HTTP aby používal iný spôsob odosielania požiadaviek.

Poznámka

Guzzle v minulosti používal na odosielanie požiadaviek HTTP len protokol cURL. úžasný klient HTTP (pravdepodobne najlepší) a Guzzle bude naďalej používať keď bude k dispozícii. Je to zriedkavé, ale niektorí vývojári nemajú cURL nainštalovaný vo svojich systémoch alebo sa stretávajú s problémami špecifickými pre danú verziu. Tým, že Guzzle umožňuje výmenu obslužných programov HTTP, je teraz oveľa lepšie prispôsobiteľný a dokáže sa prispôsobiť potrebám väčšieho počtu vývojárov.

Môže Guzzle posielať asynchrónne požiadavky?

Áno. Môžete použiť requestAsync, sendAsync, getAsync, headAsync, putAsync, postAsync, deleteAsync a patchAsync metódy klienta na odoslanie asynchrónnej požiadavky. Klient vráti GuzzleHttp\Promise\PromiseInterface objekt. Môžete reťaziť then funkcie z tohto prísľubu.

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

Asynchrónnu odpoveď môžete donútiť dokončiť pomocou metódy wait() vráteného sľubu.

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

Ako môžem pridať vlastné možnosti cURL?

cURL ponúka obrovské množstvo prispôsobiteľných možností. Zatiaľ čo Guzzle normalizuje mnohé z týchto možností v rôznych obslužných programoch, existuje niekedy je potrebné nastaviť vlastné možnosti cURL. To sa dá dosiahnuť odovzdaním asociatívneho poľa nastavení cURL v kľúči curl požiadavky.

Povedzme napríklad, že potrebujete prispôsobiť odchádzajúce sieťové rozhranie používané s klientom.

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

Ak používate asynchrónne požiadavky s obsluhou cURL multi a chcete ich upraviť, ďalšie možnosti môžete špecifikovať ako asociatívne pole v options kľúči CurlMultiHandler konštruktora.

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

Ako môžem pridať vlastné možnosti kontextu prúdu?

Môžete odovzdať vlastné možnosti kontextu prúdu pomocou kľúča stream_context možnosti požiadavky. Kľúč stream_context je asociatívne pole, kde každý kľúč je transport PHP a každá hodnota je asociatívne pole možností transportu.

Povedzme napríklad, že potrebujete prispôsobiť odchádzajúce sieťové rozhranie používané s klientom a povoliť certifikáty podpísané vlastným podpisom.

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

Prečo sa mi zobrazuje chyba overenia SSL?

Musíte zadať cestu na disku k zväzku certifikačnej autority, ktorý používa Guzzle na overenie partnerského certifikátu. Pozrite si verify.

Čo je to Chyba vnorenia maximálnej funkcie?

Maximum function nesting level of '100' reached, aborting

Na túto chybu môžete naraziť, ak máte nainštalované rozšírenie XDebug a vykonávate veľa požiadaviek v spätných volaniach. Toto chybové hlásenie prichádza konkrétne z rozšírenia XDebug. Samotné PHP nemá funkciu vnorenie funkcií. Zmeňte toto nastavenie v súbore php.ini, aby ste zvýšili limit:

xdebug.max_nesting_level = 1000

Prečo dostávam chybovú odpoveď 417?

Môže k tomu dôjsť z viacerých dôvodov, ale ak odosielate PUT, POST alebo PATCH požiadavky s hlavičkou Expect: 100-Continue, server, ktorý nemá nepodporuje túto hlavičku, vráti odpoveď 417. Môžete to obísť tak, že nastavením možnosti požiadavky expect na 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]);

Ako môžem sledovať presmerované požiadavky?

Sledovanie presmerovaných URI a stavových kódov môžete povoliť prostredníctvom track_redirects. Každý presmerovaný URI a stavový kód sa uloží do X-Guzzle-Redirect-History a X-Guzzle-Redirect-Status-History resp. záhlavie.

URI pôvodnej požiadavky a konečný stavový kód budú z výsledkov vylúčené. Vďaka tomu by ste mali byť schopní ľahko sledovať celú cestu presmerovania požiadavky.

Povedzme napríklad, že potrebujete sledovať presmerovania a poskytnúť oba výsledky spoločne v jednej správe:

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