2010-09-21 22 views
147

Ich würde gerne sehen, was die Post-Felder in der Anfrage sind, bevor ich es sende. (Für Debugging-Zwecke).PHP - Debugging Curl

Die PHP-Bibliothek (Klasse), die ich benutze, ist bereits gemacht (nicht von mir), also versuche ich es zu verstehen.

So weit ich sagen kann, verwendet es curl_setopt(), um verschiedene Optionen wie Header und so einzustellen und dann curl_exec() verwendet, um die Anfrage zu senden.

Ideen, wie man sieht, welche Postfelder gesendet werden?

+0

Siehe auch [So zeigen Sie Anforderungsheader mit der Befehlszeile curl an] (http://stackoverflow.com/q usesions/3252851/how-to-display-request-headers-mit-kommandozeile-curl). – Vadzim

Antwort

113

Sie können die CURLOPT_VERBOSE Option aktivieren:

curl_setopt($curlhandle, CURLOPT_VERBOSE, true); 

Wenn CURLOPT_VERBOSE eingestellt ist, ausgegeben zu geschrieben STDERR oder die angegebene Datei CURLOPT_STDERR verwenden. Die Ausgabe ist sehr informativ.

Sie können auch tcpdump oder wireshark verwenden, um den Netzwerkverkehr zu überwachen.

+9

Es ist erwähnenswert, dass dies nicht funktioniert, wenn Sie 'CURLINFO_HEADER_OUT' auf' TRUE' gesetzt haben. So weit wie ich sagen kann ... – Mike

310

können Sie aktivieren die CURLOPT_VERBOSE Option und melden Sie sich diese Informationen auf eine (temporäre) 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); 

Sie können es dann lesen, nachdem Locke die Anfrage gemacht hat:

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

(I ursprünglich answered similar but more extended in einer verwandten Frage.)

Weitere Informationen wie Messwerte über die letzte Anfrage ist über verfügbar curl_getinfo. Diese Information kann auch zum Debuggen von Curl-Anforderungen nützlich sein. Ein Anwendungsbeispiel, würde ich normalerweise wickeln, dass in eine Funktion:

$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

große Antwort +1 – Vignesh

+2

fopen Option sollte "w + ' – iisisrael

+1

@iisisrael: Du hast Recht. Korrigiert. Danke für den Tipp. – hakre

40

Hier ist ein einfacher Code für das gleiche ist:

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

wo $ fp eine Datei-Handle zu Ausgabefehlern ist. Zum Beispiel:

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

(Lesen Sie auf http://curl.haxx.se/mail/curlphp-2008-03/0064.html)

19

Hier ist eine noch einfachere Art und Weise, indem sie direkt auf PHP-Fehlerausgabe schreiben

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

Um nur die Informationen eines curl Antrag tun dies:

$response = curl_exec($ch); 

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

Für "nach" Antwort ist die curl_getinfo hervorragend, aber für missgebildete URLs zum Beispiel Das getinfo gibt keine Informationen zurück, das opt CURLOPT_VERBOSE ist ein besseres Beispiel – TurqSpl