PHP - Curl de depuración

211

Me gustaría ver cuáles son los campos de publicación en la solicitud antes de enviarla. (Para fines de depuración).

La biblioteca PHP (clase) que estoy usando ya está hecha (no por mí), así que estoy tratando de entenderla.

Por lo que puedo decir, se usa curl_setopt()para configurar diferentes opciones como encabezados y demás, y luego se usa curl_exec()para enviar la solicitud.

¿Ideas sobre cómo ver qué campos de publicación se envían?

Mateo
fuente

Respuestas:

175

Puedes habilitar la CURLOPT_VERBOSEopción:

curl_setopt($curlhandle, CURLOPT_VERBOSE, true);

Cuando CURLOPT_VERBOSEse establece, la salida se escribe en STDERR o en el archivo especificado mediante CURLOPT_STDERR. El resultado es muy informativo.

También puede usar tcpdump o wireshark para ver el tráfico de la red.

netom
fuente
16
Vale la pena señalar que esto no funciona si se han establecido CURLINFO_HEADER_OUTa TRUE. Por lo que puedo decir ...
Mike
400

Puede habilitar la CURLOPT_VERBOSEopción y registrar esa información en un (temporal) CURLOPT_STDERR:

// CURLOPT_VERBOSE: TRUE to output verbose information. Writes output to STDERR, 
// or the file specified using CURLOPT_STDERR.
curl_setopt($handle, CURLOPT_VERBOSE, true);

$verbose = fopen('php://temp', 'w+');
curl_setopt($handle, CURLOPT_STDERR, $verbose);

Luego puede leerlo después de que curl haya realizado la solicitud:

$result = curl_exec($handle);
if ($result === FALSE) {
    printf("cUrl error (#%d): %s<br>\n", curl_errno($handle),
           htmlspecialchars(curl_error($handle)));
}

rewind($verbose);
$verboseLog = stream_get_contents($verbose);

echo "Verbose information:\n<pre>", htmlspecialchars($verboseLog), "</pre>\n";

(Originalmente respondí similar pero más extendido en una pregunta relacionada).

Más información como métricas sobre la última solicitud está disponible a través de curl_getinfo. Esta información también puede ser útil para depurar solicitudes curl. Un ejemplo de uso, normalmente lo envolvería en una función:

$version = curl_version();
extract(curl_getinfo($handle));
$metrics = <<<EOD
URL....: $url
Code...: $http_code ($redirect_count redirect(s) in $redirect_time secs)
Content: $content_type Size: $download_content_length (Own: $size_download) Filetime: $filetime
Time...: $total_time Start @ $starttransfer_time (DNS: $namelookup_time Connect: $connect_time Request: $pretransfer_time)
Speed..: Down: $speed_download (avg.) Up: $speed_upload (avg.)
Curl...: v{$version['version']}
EOD;
hakre
fuente
2
La opción fopen debería ser 'w +'
iisisrael
1
@ iisisrael: Tienes razón. Corregido Gracias por la pista.
Hakre
Sin embargo, antes de saltar a la depuración: intente verificar el registro de apache en caso de que se arroje un error (como curl php no está instalado, ¡así que la función falló!)
TheSatinKnight
60

Aquí hay un código más simple para lo mismo:

   curl_setopt($ch, CURLOPT_VERBOSE, 1);
   curl_setopt($ch, CURLOPT_STDERR, $fp);

donde $ fp es un identificador de archivo para generar errores. Por ejemplo:

   $fp = fopen(dirname(__FILE__).'/errorlog.txt', 'w');

(Lea en http://curl.haxx.se/mail/curlphp-2008-03/0064.html )

Mario S
fuente
Me hubiera gustado usar la respuesta de @ Michaël-R- pero no obtuve detalles en el registro de PHP. Iniciar sesión en un nuevo archivo como este funcionó aunque.
Jono
29

Aquí hay una forma aún más simple, escribiendo directamente en la salida de error php

curl_setopt($curl, CURLOPT_VERBOSE, true);
curl_setopt($curl, CURLOPT_STDERR, fopen('php://stderr', 'w'));
Michaël R
fuente
22

Para obtener la información de una solicitud CURL, haga esto:

$response = curl_exec($ch);

$info = curl_getinfo($ch);
var_dump($info);
Andrés
fuente
Para la respuesta "después" el curl_getinfo es excelente, pero para urls mal formadas, por ejemplo, el getinfo devuelve información no, la opción CURLOPT_VERBOSE es mejor, por ejemplo
girorme
1

Salida de información de depuración a STDERR:

$curlHandler = curl_init();

curl_setopt_array($curlHandler, [
    CURLOPT_URL => 'https://postman-echo.com/get?foo=bar',
    CURLOPT_RETURNTRANSFER => true,

    /**
     * Specify debug option
     */
    CURLOPT_VERBOSE => true,
]);

curl_exec($curlHandler);

curl_close($curlHandler);

Salida de información de depuración al archivo:

$curlHandler = curl_init();

curl_setopt_array($curlHandler, [
    CURLOPT_URL => 'https://postman-echo.com/get?foo=bar',
    CURLOPT_RETURNTRANSFER => true,

    /**
     * Specify debug option.
     */
    CURLOPT_VERBOSE => true,

    /**
     * Specify log file.
     * Make sure that the folder is writable.
     */
    CURLOPT_STDERR => fopen('./curl.log', 'w+'),
]);

curl_exec($curlHandler);

curl_close($curlHandler);

Ver https://github.com/andriichuk/php-curl-cookbook#debug-request

Serhii Andriichuk
fuente
1

Si solo desea una forma muy rápida de depurar el resultado:

$ch = curl_init();
curl_exec($ch);
$curl_error = curl_error($ch);
echo "<script>console.log($curl_error);</script>"
Nick Spicer
fuente
0

Otra opción (cruda) es utilizar netcat para descargar la solicitud completa:

nc -l -p 8000 -w 3 | tee curldbg.txt

Y, por supuesto, enviándole la solicitud fallida:

curl_setup(CURLOPT_URL, "http://localhost/testytest");

En particular, eso siempre se bloqueará + fallará, ya que netcat nunca construirá una respuesta HTTP válida. Realmente es solo para inspeccionar lo que realmente se envió. La mejor opción, por supuesto, es utilizar un servicio de depuración de solicitudes http .

mario
fuente