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?


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.


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;

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 )


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

22

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

$response = curl_exec($ch);

$info = curl_getinfo($ch);
var_dump($info);

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


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>"

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 .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.