FAQ

¿Guzzle requiere cURL?

No. Guzzle puede utilizar cualquier manejador HTTP para enviar peticiones. Esto significa que Guzzle puede usarse con cURL, el stream wrapper de PHP, sockets y bibliotecas no bloqueantes como React. Sólo necesitas configurar un manejador HTTP para utilizar un método diferente de envío de peticiones.

Nota

Guzzle ha utilizado históricamente sólo cURL para enviar peticiones HTTP. cURL es un cliente HTTP increíble (posiblemente el mejor), y Guzzle seguirá utilizándolo por defecto cuando esté disponible. Es raro, pero algunos desarrolladores no tienen cURL instalado en sus sistemas o se encuentran con problemas específicos de la versión. Al permitir los manejadores HTTP intercambiables, Guzzle es ahora mucho más personalizable y capaz de adaptarse a las necesidades de más desarrolladores.

¿Puede Guzzle enviar peticiones asíncronas?

Sí. Puedes utilizar el requestAsync, sendAsync, getAsync, headAsync, putAsync, postAsync, deleteAsync, y patchAsync de un cliente para enviar una petición asíncrona. El cliente devolverá un GuzzleHttp\Promise\PromiseInterface objeto. Puedes encadenar funciones then a partir de la promesa.

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

Puedes forzar que una respuesta asíncrona se complete utilizando el método wait() de la promesa devuelta.

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

¿Cómo puedo añadir opciones cURL personalizadas?

cURL ofrece un gran número de opciones personalizables. Aunque Guzzle normaliza muchas de estas opciones entre los diferentes manejadores, hay hay ocasiones en las que necesitas establecer opciones cURL personalizadas. Esto puede lograrse pasando una matriz asociativa de opciones cURL en la clave curl de una solicitud.

Por ejemplo, digamos que necesita personalizar la interfaz de red saliente utilizada con un cliente.

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

Si se utilizan peticiones asíncronas con el multimanejador cURL y se quiere ajustar se pueden especificar opciones adicionales como una matriz asociativa en la clave options del constructor 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,
    ]
]))]);

¿Cómo puedo añadir opciones de contexto de flujo personalizadas?

Puede pasar opciones personalizadas de contexto de flujo utilizando la clave stream_context de la opción de solicitud. La matriz stream_context es una matriz asociativa donde cada clave es un transporte PHP, y cada valor es un array asociativo de opciones de transporte.

Por ejemplo, digamos que necesita personalizar la interfaz de red saliente utilizada con un cliente y permitir certificados autofirmados.

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

¿Por qué recibo un error de verificación SSL?

Es necesario especificar la ruta en el disco del paquete de CA utilizado por Guzzle para verificar el certificado de los compañeros. Ver verificar.

¿Qué es este error de anidación de función máxima?

Maximum function nesting level of '100' reached, aborting

Puedes encontrarte con este error si tienes instalada la extensión XDebug y ejecutas muchas peticiones en callbacks. Este mensaje de error viene específicamente de la extensión XDebug. PHP por sí mismo no tiene un límite de de anidamiento de funciones. Cambie esta configuración en su php.ini para aumentar el límite:

xdebug.max_nesting_level = 1000

¿Por qué recibo una respuesta de error 417?

Esto puede ocurrir por un número de razones, pero si usted está enviando PUT, POST, o PATCH con una cabecera Expect: 100-Continue, un servidor que no soporta esta cabecera devolverá una respuesta 417. Se puede evitar esta situación mediante estableciendo la opción de solicitud expect en 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]);

¿Cómo puedo seguir las solicitudes redirigidas?

Puede activar el seguimiento de los URIs redirigidos y los códigos de estado a través de la opción track_redirects. Cada URI redirigido y código de estado se almacenará en el archivo X-Guzzle-Redirect-History y el X-Guzzle-Redirect-Status-History respectivamente.

El URI de la solicitud inicial y el código de estado final serán excluidos de los resultados. Con esto en mente, debería ser capaz de rastrear fácilmente la ruta de redirección completa de una solicitud.

Por ejemplo, digamos que necesita hacer un seguimiento de las redirecciones y proporcionar ambos resultados juntos en un único informe:

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