PHP - Debugging Curl


211

Vorrei vedere quali sono i campi postali nella richiesta prima di inviarlo. (Ai fini del debug).

La libreria (classe) PHP che sto usando è già stata creata (non da me), quindi sto cercando di capirla.

Per quanto posso dire, utilizza curl_setopt()per impostare diverse opzioni come intestazioni e simili e quindi utilizza curl_exec()per inviare la richiesta.

Idee su come vedere quali campi postali vengono inviati?


Risposte:


175

È possibile abilitare l' CURLOPT_VERBOSEopzione:

curl_setopt($curlhandle, CURLOPT_VERBOSE, true);

Se CURLOPT_VERBOSEimpostato, l'output viene scritto su STDERR o sul file specificato utilizzando CURLOPT_STDERR. L'output è molto informativo.

Puoi anche usare tcpdump o WireShark per guardare il traffico di rete.


16
Vale la pena notare che questo non funzionerà se lo si è impostato CURLINFO_HEADER_OUTsu TRUE. Per quanto ne so ...
Mike,

400

È possibile abilitare l' CURLOPT_VERBOSEopzione e registrare tali informazioni su un (temporaneo) 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);

Puoi quindi leggerlo dopo che l'arricciatura ha inviato la richiesta:

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

(Inizialmente ho risposto in modo simile ma più esteso in una domanda correlata.)

Maggiori informazioni come le metriche sull'ultima richiesta sono disponibili tramite curl_getinfo. Queste informazioni possono essere utili anche per il debug delle richieste di arricciatura. Un esempio di utilizzo, normalmente lo avvolgo in una funzione:

$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
l'opzione fopen dovrebbe essere 'w +'
iisisrael il

1
@iisisrael: hai ragione. Corretto. Grazie per il suggerimento.
Hacre,

Prima di passare al debug, tuttavia: prova a controllare il registro di Apache nel caso in cui fosse stato lanciato un errore (come curl php non installato, quindi la funzione non è riuscita!)
TheSatinKnight

60

Ecco un codice più semplice per lo stesso:

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

dove $ fp è un handle di file per generare errori. Per esempio:

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

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


Mi sarebbe piaciuto usare la risposta di @ Michaël-R- ma non sono stato dettagliato nel registro di PHP. La registrazione in un nuovo file come questo ha funzionato comunque.
Jono,

29

Ecco un modo ancora più semplice, scrivendo direttamente all'output dell'errore php

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

22

Per ottenere solo le informazioni di una richiesta CURL, procedere come segue:

$response = curl_exec($ch);

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

Per la risposta "after" curl_getinfo è eccellente, ma per gli URL non validi, ad esempio getinfo restituisce non informazioni, opt CURLOPT_VERBOSE è un esempio migliore
girorme,

1

Invia informazioni di debug 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);

Invia informazioni di debug al file:

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

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


1

Se vuoi solo un modo molto rapido per eseguire il debug del risultato:

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

0

Un'altra opzione (grezza) è utilizzare netcat per il dumping della richiesta completa:

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

E ovviamente inviandogli la richiesta non riuscita:

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

In particolare ciò si bloccherà sempre + fallirà, poiché netcat non costruirà mai una risposta HTTP valida. È davvero solo per ispezionare ciò che è stato veramente inviato. L'opzione migliore, ovviamente, sta usando un servizio di debug delle richieste http .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.