FAQś

Czy Guzzle wymaga cURL?ś

Nie. Guzzle może wykorzystywać dowolny handler HTTP do wysyłania żądań. Oznacza to, że Guzzle może być używany z cURL, wrapperem strumienia PHP, gniazdami i bibliotekami nieblokującymi jak React. Musisz tylko skonfigurować handler HTTP aby używać innej metody wysyłania żądań.

Uwaga

Guzzle historycznie wykorzystywał wyłącznie cURL do wysyłania żądań HTTP. niesamowitym klientem HTTP (prawdopodobnie najlepszym), a Guzzle będzie nadal używał go domyślnie, gdy będzie dostępny. Jest to rzadkie, ale niektórzy deweloperzy nie nie mają cURL zainstalowanego w swoich systemach lub napotykają na problemy związane z jego wersją. Dzięki możliwości zamiany obsługi HTTP, Guzzle jest teraz znacznie bardziej konfigurowalny i jest w stanie dopasować się do potrzeb większej liczby deweloperów.

Czy Guzzle może wysyłać żądania asynchroniczne?ś

Tak. Możesz użyć requestAsync, sendAsync, getAsync, headAsync, putAsync, postAsync, deleteAsync, oraz patchAsync. metod klienta, aby wysłać asynchroniczne żądanie. Klient zwróci wartość obiekt GuzzleHttpPromiseInterface. Możesz łańcuchować then funkcji z obietnicy.

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

Możesz zmusić asynchroniczną odpowiedź do zakończenia, używając metody wait() zwróconej obietnicy.

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

Jak mogę dodać własne opcje cURL?ś

cURL oferuje ogromną liczbę konfigurowalnych opcji. Podczas gdy Guzzle normalizuje wiele z tych opcji dla różnych handlerów, zdarzają się sytuacje, w których zdarzają się sytuacje, w których trzeba ustawić własne opcje cURL. Można to osiągnąć przekazując tablicę asocjacyjną ustawień cURL w kluczu curl żądania. żądania.

Na przykład, powiedzmy, że musisz dostosować wychodzący interfejs sieciowy używany przez klienta.

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

Jeśli używasz asynchronicznych żądań z multi handlerem cURL i chcesz go podrasować, dodatkowe opcje mogą być określone jako tablica asocjacyjna w kluczu options klucza konstruktora CurlMultiHandler.

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 dodać własne opcje kontekstu strumienia?

Możesz przekazać niestandardowe opcje kontekstu strumienia używając klucza stream_context opcji żądania. The stream_context jest tablicą asocjacyjną, gdzie każdy klucz jest transportem PHP, a każda wartość jest tablicą asocjacyjną opcji transportowych.

Na przykład, powiedzmy, że trzeba dostosować wychodzący interfejs sieciowy używany z klientem i zezwolić na samopodpisane certyfikaty.

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

Dlaczego otrzymuję błąd weryfikacji SSL?

Musisz podać ścieżkę na dysku do pakietu CA używanego przez Guzzle'a do weryfikacji certyfikatu partnera. Zobacz verify.

Co to jest ten maksymalny błąd zagnieżdżania funkcji?

Maximum function nesting level of '100' reached, aborting

Możesz napotkać ten błąd, jeśli masz zainstalowane rozszerzenie XDebug i wykonujesz wiele żądań w wywołaniach zwrotnych. Ten komunikat o błędzie pochodzi właśnie z rozszerzenia XDebug. PHP samo w sobie nie posiada limitu zagnieżdżania funkcji limitu zagnieżdżania funkcji. Zmień to ustawienie w swoim php.ini, aby zwiększyć limit:

xdebug.max_nesting_level = 1000

Dlaczego dostaję odpowiedź z błędem 417?

Może się to zdarzyć z wielu powodów, ale jeśli wysyłasz żądania PUT, POST, lub PATCH z nagłówkiem Expect: 100-Continue, serwer, który nie obsługuje tego nagłówka zwróci odpowiedź 417. obsługuje tego nagłówka, zwróci odpowiedź 417. Można to obejść poprzez ustawienie opcji żądania 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 mogę śledzić przekierowane żądania?ś

Możesz włączyć śledzenie przekierowanych URI i kodów statusu poprzez opcję track_redirects opcji. Każdy przekierowany URI i kod statusu będzie przechowywany w X-Guzzle-Redirect-History oraz X-Guzzle-Redirect-Status-History odpowiednio nagłówek.

Początkowy URI żądania oraz końcowy kod statusu zostaną wyłączone z wyników. Mając to na uwadze, powinieneś być w stanie łatwo śledzić pełną ścieżkę przekierowania żądania.

Na przykład, załóżmy, że potrzebujesz śledzić przekierowania i przedstawić oba wyniki razem w jednym raporcie:

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