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.