2010-09-21 21 views
147

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

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

Por lo que puedo decir, usa curl_setopt() para establecer diferentes opciones como encabezados y tal y luego usa curl_exec() para enviar la solicitud.

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

+0

Vea también [Cómo mostrar encabezados de solicitud con curl de línea de comando] (http://stackoverflow.com/q uestions/3252851/how-to-display-request-headers-with-command-line-curl). – Vadzim

Respuesta

113

puede activar la opción CURLOPT_VERBOSE:

curl_setopt($curlhandle, CURLOPT_VERBOSE, true); 

Cuando se establece CURLOPT_VERBOSE, la salida se escribe en STDERR o el archivo especificado utilizando CURLOPT_STDERR. La salida es muy informativa.

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

+9

Vale la pena señalar que esto no funcionará si ha configurado 'CURLINFO_HEADER_OUT' en' TRUE'. Por lo que puedo decir ... – Mike

310

Puede activar la opción CURLOPT_VERBOSE y registrar esa información a 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); 

continuación, puede leer después de rizo ha hecho 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"; 

(que originalmente answered similar but more extended en una pregunta relacionada.)

Más información como métricas sobre la última solicitud disponible vía curl_getinfo. Esta información también puede ser útil para depurar solicitudes curl. Un ejemplo de uso, lo que normalmente envuelve 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; 
+3

gran respuesta +1 – Vignesh

+2

opción de fopen debe ser 'w +' – iisisrael

+1

@iisisrael: Tienes razón. Corregido Gracias por la pista. – hakre

40

Aquí es un código más simple para el mismo:

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

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

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

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

19

Aquí es una manera aún más simple, escribiendo directamente a la salida de error php

curl_setopt($curl, CURLOPT_VERBOSE, true); 
curl_setopt($curl, CURLOPT_STDERR, fopen('php://stderr', 'w')); 
9

para obtener sólo la información de una solicitud CURL hacer esto:

$response = curl_exec($ch); 

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

Para la respuesta "después" curl_getinfo es excelente pero para URL malformadas, por ejemplo el getinfo no devuelve información, la opción CURLOPT_VERBOSE es una mejor, por ejemplo – TurqSpl