web-dev-qa-db-fra.com

PHP - Déboguer Curl

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

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

Autant que je sache, il utilise curl_setopt() pour définir différentes options, telles que les en-têtes, etc., puis il utilise curl_exec() pour envoyer la demande.

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

193
Matthew

Vous pouvez activer l'option CURLOPT_VERBOSE:

curl_setopt($curlhandle, CURLOPT_VERBOSE, true);

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

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

157
netom

Vous pouvez activer l'option _CURLOPT_VERBOSE_ et consigner 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 alors le lire après que curl ait fait 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";
_

(À l'origine, réponse similaire mais plus étendue dans une question connexe.)

Plus d'informations telles que les métriques sur la dernière demande sont disponibles via curl_getinfo . Ces informations peuvent également être utiles pour le débogage des demandes de curl. Un exemple d'utilisation, je voudrais normalement envelopper 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;
_
377
hakre

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 )

55
Mario S

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

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

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

$response = curl_exec($ch);

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

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

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

Et bien sûr, en lui envoyant la requête en échec:

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

En particulier, cela bloquera toujours + échouer, car netcat ne construira jamais de 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 demande http .

0
mario

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

Exporter les 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

0
Serge Andriichuk