PHP - Debugging Curl

210

Ich möchte sehen, welche Postfelder in der Anfrage enthalten sind, bevor ich sie sende. (Zum Debuggen).

Die von mir verwendete PHP-Bibliothek (Klasse) ist bereits erstellt (nicht von mir), daher versuche ich, sie zu verstehen.

Soweit ich das beurteilen kann, werden curl_setopt()verschiedene Optionen wie Header und dergleichen festgelegt und anschließend curl_exec()die Anfrage gesendet.

Ideen, wie Sie sehen können, welche Postfelder gesendet werden?

Matthew
quelle

Antworten:

174

Sie können die CURLOPT_VERBOSEOption aktivieren :

curl_setopt($curlhandle, CURLOPT_VERBOSE, true);

Wenn CURLOPT_VERBOSEgesetzt, wird die Ausgabe in STDERR oder die mit angegebene Datei geschrieben CURLOPT_STDERR. Die Ausgabe ist sehr informativ.

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

netom
quelle
16
Es ist erwähnenswert, dass dies nicht funktionieren , wenn Sie gesetzt CURLINFO_HEADER_OUTzu TRUE. Soweit ich das beurteilen kann ...
Mike
399

Sie können die CURLOPT_VERBOSEOption aktivieren und diese Informationen in einem (temporären) Protokoll protokollieren 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 Curl die Anforderung ausgeführt 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";

(Ich habe ursprünglich in einer verwandten Frage ähnlich, aber ausführlicher geantwortet .)

Weitere Informationen wie Metriken zur letzten Anfrage finden Sie unter curl_getinfo. Diese Informationen können auch zum Debuggen von Curl-Anforderungen hilfreich sein. Als Anwendungsbeispiel würde ich das normalerweise in eine Funktion einbinden:

$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
quelle
2
fopen Option sollte 'w +' sein
Israel
1
@iisisrael: Du hast recht. Korrigiert. Danke für den Tipp.
hakre
Bevor Sie jedoch mit dem Debuggen beginnen: Überprüfen Sie das Apache-Protokoll, falls ein Fehler aufgetreten ist (z. B. Curl PHP wurde nicht installiert, sodass die Funktion fehlschlug!)
TheSatinKnight
59

Hier ist ein einfacherer Code für dasselbe:

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

Dabei ist $ fp ein Dateihandle zum Ausgeben von Fehlern. Beispielsweise:

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

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

Mario S.
quelle
Ich hätte gerne die Antwort von @ Michaël-R- verwendet, aber ich wurde im PHP-Protokoll nicht ausführlich. Das Anmelden in einer neuen Datei wie dieser hat funktioniert.
Jono
28

Hier ist eine noch einfachere Möglichkeit, indem Sie direkt in die PHP-Fehlerausgabe schreiben

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

Gehen Sie folgendermaßen vor, um nur die Informationen einer CURL-Anfrage zu erhalten:

$response = curl_exec($ch);

$info = curl_getinfo($ch);
var_dump($info);
Andrew
quelle
Für "nach" Antwort ist die curl_getinfo ausgezeichnet, aber für fehlerhafte URLs zum Beispiel gibt die getinfo keine Informationen zurück, die opt CURLOPT_VERBOSE ist zum Beispiel besser
girorme
1

Wenn Sie nur einen sehr schnellen Weg zum Debuggen des Ergebnisses suchen:

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

Eine andere (grobe) Option besteht darin, netcat zum Dumping der vollständigen Anforderung zu verwenden:

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

Und natürlich die fehlgeschlagene Anfrage an sie senden:

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

Insbesondere wird das immer hängen bleiben + fehlschlagen, da Netcat niemals eine gültige HTTP-Antwort erstellen wird. Es ist wirklich nur, um zu überprüfen, was wirklich gesendet wurde. Die bessere Option ist natürlich die Verwendung eines http-Anforderungs-Debugging-Dienstes .

Mario
quelle
0

Debug-Informationen an STDERR ausgeben:

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

Debug-Informationen in Datei ausgeben:

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

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

Serhii Andriichuk
quelle