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?


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.


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;

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 )


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

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

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

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 .


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.