2010-09-21 3 views
147

Я хотел бы видеть, что поля сообщения в запросе, прежде чем я отправлю его. (Для целей отладки).Php - Отладка Curl

Библиотека php (класс), которую я использую, уже создана (не мной), поэтому я пытаюсь ее понять.

Насколько я могу судить, он использует curl_setopt() для установки различных параметров, таких как заголовки и т. Д., А затем использует curl_exec() для отправки запроса.

Идеи о том, как узнать, какие почтовые поля отправляются?

+0

См. также [Как отобразить заголовки запросов с зависком командной строки] (http://stackoverflow.com/q ОПРОСЫ/3252851/как-на-дисплей-Request-Headers-с-командной строки-завиток). – Vadzim

ответ

113

Вы можете включить опцию: CURLOPT_VERBOSE

curl_setopt($curlhandle, CURLOPT_VERBOSE, true); 

Когда CURLOPT_VERBOSE установлен, вывод записывается в STDERR или указанный файл с помощью CURLOPT_STDERR. Выход очень информативный.

Вы также можете использовать tcpdump или wirehark для просмотра сетевого трафика.

+9

Стоит отметить, что это не сработает, если вы установили 'CURLINFO_HEADER_OUT'' TRUE'. Насколько я могу судить ... – Mike

310

Вы можете включить опцию CURLOPT_VERBOSE и журнал эту информацию к (временно) 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); 

Вы можете прочитать его после того, как завиток сделал запрос:

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

(я первоначально answered similar but more extended в соответствующем вопросе.)

Дополнительная информация, такая как метрики о последнем запросе, доступна через curl_getinfo. Эта информация может быть полезна и для отладки запросов на завивки. Пример использования, я обычно обертку в функцию:

$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; 
+3

отличный ответ +1 – Vignesh

+2

fopen вариант должен быть 'w +' – iisisrael

+1

@iisisrael: Вы правы. Исправленный. Спасибо за подсказку. – hakre

40

Вот простой код для того же:

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

где $ Порцзолт является дескриптор файла для вывода ошибок. Например:

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

(читать http://curl.haxx.se/mail/curlphp-2008-03/0064.html)

19

Вот еще проще способ, написав непосредственно на PHP вывод ошибок

curl_setopt($curl, CURLOPT_VERBOSE, true); 
curl_setopt($curl, CURLOPT_STDERR, fopen('php://stderr', 'w')); 
9

Чтобы просто получить информацию о запросе CURL сделать это:

$response = curl_exec($ch); 

$info = curl_getinfo($ch); 
var_dump($info); 
+0

Для ответа «после» curl_getinfo его отличный, но для некорректных URL-адресов, например getinfo возвращает non info, opt CURLOPT_VERBOSE лучше, например – TurqSpl