FAQ

Benötigt Guzzle cURL?

Nein. Guzzle kann jeden HTTP-Handler verwenden, um Anfragen zu senden. Das bedeutet, dass Guzzle mit cURL, dem PHP-Stream-Wrapper, Sockets und nicht-blockierenden Bibliotheken verwendet werden kann wie React. Sie müssen lediglich einen HTTP-Handler konfigurieren konfigurieren, um eine andere Methode zum Senden von Anfragen zu verwenden.

Hinweis

Guzzle hat in der Vergangenheit nur cURL verwendet, um HTTP-Anfragen zu senden. cURL ist ein hervorragender HTTP-Client (wohl der beste), und Guzzle wird ihn weiterhin standardmäßig verwenden, wenn es verfügbar ist. Es ist selten, aber einige Entwickler haben nicht cURL nicht auf ihren Systemen installiert haben oder auf versionsspezifische Probleme stoßen. Durch die Möglichkeit, HTTP-Handler auszutauschen, ist Guzzle nun viel anpassungsfähiger und kann sich an die Bedürfnisse von mehr Entwicklern anpassen.

Kann Guzzle asynchrone Anfragen senden?

Ja. Sie können die requestAsync, sendAsync, getAsync verwenden, headAsync, putAsync, postAsync, deleteAsync, und patchAsync Methoden eines Clients, um eine asynchrone Anfrage zu senden. Der Client gibt ein GuzzleHttp\Promise\PromiseInterface Objekt zurück. Sie können then Funktionen mit dem Versprechen verketten.

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

Sie können den Abschluss einer asynchronen Antwort erzwingen, indem Sie die Methode wait() des zurückgegebenen Versprechens verwenden.

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

Wie kann ich eigene cURL-Optionen hinzufügen?

cURL bietet eine große Anzahl von anpassbaren Optionen. Während Guzzle viele dieser Optionen über verschiedene Handler hinweg normalisiert, gibt es gibt es Fälle, in denen Sie eigene cURL-Optionen festlegen müssen. Dies kann erreicht werden durch die Übergabe eines assoziativen Arrays von cURL-Einstellungen im curl Schlüssel einer Anfrage übergeben wird.

Nehmen wir zum Beispiel an, Sie müssen die ausgehende Netzwerkschnittstelle, die mit einem Client verwendet wird, anpassen.

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

Wenn Sie asynchrone Anfragen mit dem cURL-Multi-Handler verwenden und diesen optimieren wollen, können zusätzliche Optionen als assoziatives Array im Schlüssel options Schlüssel des CurlMultiHandler Konstruktors angegeben werden.

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

Wie kann ich benutzerdefinierte Stream-Kontextoptionen hinzufügen?

Sie können benutzerdefinierte Stream-Kontextoptionen unter Verwendung des stream_context Schlüssels der Anfrageoption übergeben. Das stream_context Array ist ein assoziatives Array, in dem jeder Schlüssel ein PHP-Transport ist und jeder Wert ein assoziatives Array von Transportoptionen ist.

Nehmen wir zum Beispiel an, Sie müssen die ausgehende Netzwerkschnittstelle, die mit einem Client verwendet wird, anpassen und selbstsignierte Zertifikate zulassen.

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

Warum erhalte ich einen SSL-Überprüfungsfehler?

Sie müssen den Pfad auf der Festplatte zum CA-Bundle angeben, das von Guzzle für die Überprüfung des Peer-Zertifikats verwendet wird. Siehe verify.

Was ist dieser Maximum function nesting error?

Maximum function nesting level of '100' reached, aborting

Dieser Fehler kann auftreten, wenn Sie die XDebug-Erweiterung installiert haben und Sie viele Anfragen in Callbacks ausführen. Diese Fehlermeldung kommt speziell von der XDebug-Erweiterung. PHP selbst hat keine Funktions Verschachtelungsgrenze. Ändern Sie diese Einstellung in Ihrer php.ini, um das Limit zu erhöhen:

xdebug.max_nesting_level = 1000

Warum bekomme ich eine 417-Fehlerantwort?

Dies kann aus einer Reihe von Gründen auftreten, aber wenn Sie PUT, POST, oder PATCH-Anfragen mit einem Expect: 100-Continue Header senden, wird ein Server, der diesen Header nicht diesen Header nicht unterstützt, eine Antwort von 417 zurück. Sie können dieses Problem umgehen, indem Sie die Anfrageoption expect auf false setzen:

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

Wie kann ich umgeleitete Anfragen verfolgen?

Sie können die Verfolgung von umgeleiteten URIs und Statuscodes mit der Option Option track_redirects aktivieren. Jede umgeleitete URI und jeder Statuscode wird in der X-Guzzle-Redirect-History und dem X-Guzzle-Redirect-Status-History Header.

Der URI der ursprünglichen Anfrage und der endgültige Statuscode werden von den Ergebnissen ausgeschlossen. Auf diese Weise sollten Sie in der Lage sein, den vollständigen Umleitungspfad einer Anfrage leicht zu verfolgen.

Nehmen wir zum Beispiel an, Sie müssen Weiterleitungen verfolgen und beide Ergebnisse in einem einzigen Bericht zusammenfassen:

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