PHP - Débogage Curl

211

J'aimerais voir quels sont les champs de message dans la demande avant de l'envoyer. (À des fins de débogage).

La bibliothèque PHP (classe) que j'utilise est déjà faite (pas par moi), donc j'essaie de la comprendre.

Pour autant que je sache, il utilise curl_setopt()pour définir différentes options comme les en-têtes et autres, puis il utilise curl_exec()pour envoyer la demande.

Des idées sur la façon de voir quels champs de message sont envoyés?

Matthieu
la source

Réponses:

175

Vous pouvez activer l' CURLOPT_VERBOSEoption:

curl_setopt($curlhandle, CURLOPT_VERBOSE, true);

Lorsque CURLOPT_VERBOSEest défini, la sortie est écrite dans STDERR ou dans le fichier spécifié à l'aide de CURLOPT_STDERR. La sortie est très informative.

Vous pouvez également utiliser tcpdump ou cableshark pour surveiller le trafic réseau.

netom
la source
16
Il est intéressant de noter que cela ne fonctionnera pas si vous avez défini CURLINFO_HEADER_OUTà TRUE. Pour autant que je sache ...
Mike
400

Vous pouvez activer l' CURLOPT_VERBOSEoption et enregistrer ces informations dans un (temporaire) 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);

Vous pouvez ensuite le lire une fois que curl a effectué la demande:

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

(J'ai répondu à l' origine similaire mais plus étendu dans une question connexe.)

Plus d'informations, telles que des statistiques sur la dernière demande, sont disponibles via curl_getinfo. Ces informations peuvent également être utiles pour le débogage des requêtes curl. Un exemple d'utilisation, j'envelopperais normalement cela dans une fonction:

$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
la source
2
L'option fopen devrait être 'w +'
iisisrael
1
@iisisrael: Vous avez raison. Corrigée. Merci pour l'astuce.
hakre
Avant de vous lancer dans le débogage, cependant: essayez de vérifier le journal d'apache au cas où une erreur serait lancée (comme curl php non installé, donc la fonction a échoué!)
TheSatinKnight
60

Voici un code plus simple pour le même:

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

où $ fp est un descripteur de fichier pour générer des erreurs. Par exemple:

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

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

Mario S
la source
J'aurais aimé utiliser la réponse de @ Michaël-R- mais je n'ai pas été verbeux dans le journal PHP. La connexion à un nouveau fichier comme celui-ci a fonctionné.
Jono
29

Voici un moyen encore plus simple, en écrivant directement sur la sortie d'erreur php

curl_setopt($curl, CURLOPT_VERBOSE, true);
curl_setopt($curl, CURLOPT_STDERR, fopen('php://stderr', 'w'));
Michaël R
la source
22

Pour obtenir simplement les informations d'une demande CURL, procédez comme suit:

$response = curl_exec($ch);

$info = curl_getinfo($ch);
var_dump($info);
Andrew
la source
Pour une réponse "après" le curl_getinfo son excellent mais pour les URL mal formées par exemple le getinfo retourne non info, l'opt CURLOPT_VERBOSE est un meilleur par exemple
girorme
1

Exportez les informations de débogage vers 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);

Sortie des informations de débogage dans un fichier:

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

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

Serhii Andriichuk
la source
1

Si vous voulez juste un moyen très rapide de déboguer le résultat:

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

Une autre option (brute) consiste à utiliser netcat pour vider la demande complète:

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

Et bien sûr en lui envoyant la demande qui a échoué:

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

Notamment, cela va toujours se bloquer + échouer, car netcat ne construira jamais une réponse HTTP valide. C'est vraiment juste pour inspecter ce qui a vraiment été envoyé. La meilleure option, bien sûr, utilise un service de débogage de requête http .

mario
la source