FAQ

Vyžaduje Guzzle cURL?

Ne. Guzzle může k odesílání požadavků použít libovolnou obslužnou rutinu HTTP. To znamená, že Guzzle lze použít s cURL, obalem PHP pro proud, sokety a neblokujícími knihovnami. jako je React. Stačí nakonfigurovat obsluhu HTTP aby používal jiný způsob odesílání požadavků.

Poznámka

Guzzle v minulosti používal k odesílání požadavků HTTP pouze protokol cURL. úžasný klient HTTP (pravděpodobně nejlepší) a Guzzle bude i nadále používat cURL. ve výchozím nastavení, jakmile bude k dispozici. Je to sice vzácné, ale někteří vývojáři to nedělají. cURL nainstalovaný ve svých systémech nebo narazí na problémy specifické pro danou verzi. Tím, že Guzzle umožňuje výměnné obsluhy HTTP, je nyní mnohem lépe přizpůsobitelný a může se přizpůsobit potřebám většího počtu vývojářů.

Umí Guzzle posílat asynchronní požadavky?

Ano, můžete použít requestAsync, sendAsync, getAsync, headAsync, putAsync, postAsync, deleteAsync a patchAsync. metody klienta pro odeslání asynchronního požadavku. Klient vrátí GuzzleHttp\Promise\PromiseInterface objekt. Můžete řetězit then funkce z tohoto slibu.

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

Asynchronní odpověď můžete vynutit k dokončení pomocí wait() metody vráceného slibu.

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

Jak mohu přidat vlastní možnosti cURL?

cURL nabízí obrovské množství přizpůsobitelných možností. Zatímco Guzzle normalizuje mnoho z těchto možností napříč různými obslužnými programy, existuje někdy je třeba nastavit vlastní možnosti cURL. Toho lze dosáhnout předáním asociativního pole nastavení cURL v klíči curl příkazu požadavku.

Řekněme například, že potřebujete přizpůsobit odchozí síťové rozhraní používané s klientem.

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

Pokud používáte asynchronní požadavky s obsluhou cURL multi a chcete je upravit, lze další možnosti zadat jako asociativní pole v příkazu options klíči CurlMultiHandler konstruktoru.

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

Jak mohu přidat vlastní možnosti kontextu streamu?

Můžete předat vlastní možnosti kontextu proudu pomocí klíče stream_context volby požadavku. Klíč stream_context je asociativní pole, kde každý klíč je transport PHP a každá hodnota je asociativní pole možností transportu.

Řekněme například, že potřebujete přizpůsobit odchozí síťové rozhraní používané s klientem a povolit certifikáty podepsané vlastním podpisem.

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

Proč se mi zobrazuje chyba ověření SSL?

Je třeba zadat cestu na disku ke svazku certifikační autority, který Guzzle používá k ověření certifikátu partnera. Viz verify.

Co je to Chyba vnoření maximální funkce?

Maximum function nesting level of '100' reached, aborting

Na tuto chybu můžete narazit, pokud máte nainstalováno rozšíření XDebug a spouštíte mnoho požadavků v zpětných voláních. Tato chybová zpráva se objeví právě z rozšíření XDebug. Samotné PHP nemá funkci vnořování funkcí. Změňte toto nastavení v souboru php.ini, abyste limit zvýšili:

xdebug.max_nesting_level = 1000

Proč se mi zobrazuje chybová odpověď 417?

Může k tomu dojít z mnoha důvodů, ale pokud odesíláte PUT, POST nebo PATCH požadavky s hlavičkou Expect: 100-Continue, server, který nemá tuto hlavičku nepodporuje, vrátí odpověď 417. To lze obejít následujícím způsobem nastavením možnosti požadavku 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]);

Jak mohu sledovat přesměrované požadavky?

Sledování přesměrovaných URI a stavových kódů můžete povolit pomocí příkazu track_redirects. Každý přesměrovaný URI a stavový kód se uloží do složky X-Guzzle-Redirect-History a X-Guzzle-Redirect-Status-History. respektive záhlaví.

URI původního požadavku a konečný stavový kód budou z výsledků vyloučeny. Díky tomu byste měli být schopni snadno sledovat celou cestu přesměrování požadavku.

Řekněme například, že potřebujete sledovat přesměrování a poskytnout oba výsledky společně v jedné zprávě:

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