FAQ

Guzzle requiert-il cURL ?

Non. Guzzle peut utiliser n'importe quel gestionnaire HTTP pour envoyer des requêtes. Cela signifie que Guzzle peut être utilisé avec cURL, le wrapper de flux de PHP, les sockets et les bibliothèques non bloquantes comme React. comme React. Il vous suffit de configurer un gestionnaire HTTP pour utiliser une méthode différente d'envoi des requêtes.

Note

Historiquement, Guzzle n'a utilisé que cURL pour envoyer des requêtes HTTP. cURL est un excellent client HTTP (sans doute le meilleur). un client HTTP extraordinaire (sans doute le meilleur), et Guzzle continuera à l'utiliser par Guzzle continuera à l'utiliser par défaut lorsqu'il sera disponible. C'est rare, mais certains développeurs n'ont pas n'ont pas installé cURL sur leur système ou rencontrent des problèmes de version. En autorisant les gestionnaires HTTP interchangeables, Guzzle est maintenant beaucoup plus personnalisable et capable de s'adapter aux besoins des utilisateurs. et capable de s'adapter aux besoins d'un plus grand nombre de développeurs.

Guzzle peut-il envoyer des requêtes asynchrones ?

Oui. Vous pouvez utiliser le requestAsync, sendAsync, getAsync, headAsync, putAsync, postAsync, deleteAsync, et patchAsync d'un client pour envoyer une requête asynchrone. Le client retournera un GuzzleHttp\Promise\PromiseInterface objet. Vous pouvez enchaîner des fonctions then à partir de la promesse.

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

Vous pouvez forcer une réponse asynchrone à se terminer en utilisant la méthode wait() de la promesse retournée.

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

Comment puis-je ajouter des options cURL personnalisées ?

cURL offre un grand nombre d'options personnalisables. Bien que Guzzle normalise un grand nombre de ces options pour les différents gestionnaires il est parfois nécessaire de définir des options cURL personnalisées. Cela peut être accompli en passant un tableau associatif de paramètres cURL dans la clé curl d'une requête. requête.

Par exemple, disons que vous devez personnaliser l'interface réseau sortante utilisée avec un client.

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

Si vous utilisez des requêtes asynchrones avec le multi-manipulateur cURL et que vous souhaitez le modifier, des options supplémentaires peuvent être spécifiées sous forme de tableau associatif dans la clé options de la clé du constructeur 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,
    ]
]))]);

Comment puis-je ajouter des options de contexte de flux personnalisées ?

Vous pouvez transmettre des options de contexte de flux personnalisées en utilisant la clé stream_context de l'option de requête. Le tableau stream_context est un tableau associatif dans lequel chaque clé est un transport PHP, et chaque valeur est un tableau associatif d'options de transport.

Par exemple, disons que vous devez personnaliser l'interface réseau sortante utilisée avec un client et autoriser les certificats auto-signés.

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

Pourquoi est-ce que je reçois une erreur de vérification SSL ?

Vous devez spécifier le chemin d'accès sur le disque au bundle de l'autorité de certification utilisé par Guzzle pour vérifier le certificat du pair. Voir verify.

Qu'est-ce que cette erreur d'imbrication de fonctions maximales ?

Maximum function nesting level of '100' reached, aborting

Vous pouvez rencontrer cette erreur si l'extension XDebug est installée et que vous vous exécutez beaucoup de demandes dans les callbacks. Ce message d'erreur provient spécifiquement de l'extension XDebug. PHP lui-même n'a pas de limite d'imbrication limite d'imbrication des fonctions. Modifiez ce paramètre dans votre php.ini pour augmenter cette limite :

xdebug.max_nesting_level = 1000

Pourquoi est-ce que je reçois une réponse d'erreur 417 ?

Cela peut se produire pour un certain nombre de raisons, mais si vous envoyez des demandes PUT, POST, ou PATCH avec un en-tête Expect : 100-Continue, un serveur qui ne prend pas en charge cet en-tête renverra une réponse 417. ne supporte pas cet en-tête renverra une réponse 417. Vous pouvez contourner ce problème en définissant l'option de requête expect à 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]);

Comment puis-je suivre les demandes redirigées ?

Vous pouvez activer le suivi des URI et des codes d'état redirigés via l'option option track_redirects. Chaque URI et code d'état redirigé sera stocké dans le fichier X-Guzzle-Redirect-History et X-Guzzle-Redirect-Status-History respectivement.

L'URI de la demande initiale et le code d'état final seront exclus des résultats. En gardant cela à l'esprit, vous devriez être en mesure de suivre facilement le chemin de redirection complet d'une demande.

Par exemple, disons que vous devez suivre les redirections et fournir les deux résultats ensemble dans un seul rapport :

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