PHP - Onda de depuração

210

Gostaria de ver quais são os campos de postagem na solicitação antes de enviá-la. (Para fins de depuração).

A biblioteca PHP (classe) que estou usando já foi criada (não por mim), por isso estou tentando entender.

Tanto quanto eu posso dizer, ele usa curl_setopt()para definir opções diferentes, como cabeçalhos e outros, e depois usa curl_exec()para enviar a solicitação.

Idéias sobre como ver quais campos de postagem estão sendo enviados?

Mateus
fonte

Respostas:

174

Você pode ativar a CURLOPT_VERBOSEopção:

curl_setopt($curlhandle, CURLOPT_VERBOSE, true);

Quando CURLOPT_VERBOSEdefinido, a saída é gravada em STDERR ou no arquivo especificado usando CURLOPT_STDERR. A saída é muito informativa.

Você também pode usar tcpdump ou wireshark para assistir ao tráfego da rede.

netom
fonte
16
Vale a pena notar que isto não vai funcionar se você tiver definido CURLINFO_HEADER_OUTa TRUE. Até onde eu sei ...
Mike
399

Você pode ativar a CURLOPT_VERBOSEopção e registrar essas informações em um (temporário) 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);

Você pode lê-lo depois que o curl tiver feito a solicitação:

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

(Eu originalmente respondi de maneira semelhante, mas mais estendida em uma pergunta relacionada.)

Mais informações, como métricas sobre a última solicitação, estão disponíveis em curl_getinfo. Essas informações também podem ser úteis para depurar solicitações de curl. Um exemplo de uso, eu normalmente agruparia isso em uma função:

$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
fonte
2
A opção fopen deve ser 'w +'
iisisrael 13/08/2015
1
@iisisrael: Você está certo. Corrigido. Obrigado pela dica.
hakre
Antes de saltar para a depuração, no entanto: Tente verificar o log do apache no caso de um erro foi jogado (como onda php não está sendo instalado, então a função falhou!)
TheSatinKnight
59

Aqui está um código mais simples para o mesmo:

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

onde $ fp é um identificador de arquivo para gerar erros. Por exemplo:

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

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

Mario S
fonte
Eu gostaria de usar a resposta de @ Michaël-R-, mas não fiquei detalhada no log do PHP. Entrar em um novo arquivo como este funcionou.
Jono
28

Aqui está uma maneira ainda mais simples, escrevendo diretamente na saída de erro do php

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

Para obter apenas as informações de uma solicitação CURL, faça o seguinte:

$response = curl_exec($ch);

$info = curl_getinfo($ch);
var_dump($info);
Andrew
fonte
Para "depois" a resposta curl_getinfo sua excelente mas para urls mal formados por exemplo a getInfo retornos não informações, o opt CURLOPT_VERBOSE seu melhor, por exemplo
girorme
1

Se você quer apenas uma maneira muito rápida de depurar o resultado:

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

Outra opção (bruta) é utilizar o netcat para descarregar a solicitação completa:

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

E, é claro, enviando a solicitação com falha:

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

Notavelmente, isso sempre travará + falhará, pois o netcat nunca construirá uma resposta HTTP válida. É realmente apenas para inspecionar o que realmente foi enviado. A melhor opção, é claro, é usar um serviço de depuração de solicitação http .

mario
fonte
0

Informações de depuração de saída para 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);

Informações de depuração de saída para o arquivo:

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

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

Serhii Andriichuk
fonte