PHP – Отладка Curl

Вопрос или проблема

Я хотел бы увидеть, какие поля POST находятся в запросе, прежде чем отправить его. (Для отладки).

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

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

Есть идеи, как увидеть, какие поля POST отправляются?

Вы можете включить опцию CURLOPT_VERBOSE Curl, PHP и записывать эту информацию в (временный) CURLOPT_STDERR:

// CURLOPT_VERBOSE: TRUE для вывода подробной информации.
// Записывает вывод в STDERR,
// -или- файл, указанный с помощью CURLOPT_STDERR.
curl_setopt($curlHandle, CURLOPT_VERBOSE, true);

$streamVerboseHandle = fopen('php://temp', 'w+');
curl_setopt($curlHandle, CURLOPT_STDERR, $streamVerboseHandle);

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

$result = curl_exec($curlHandle);
if ($result === FALSE) {
    printf("Ошибка cUrl (#%d): %s<br>\n",
           curl_errno($curlHandle),
           htmlspecialchars(curl_error($curlHandle)))
           ;
}

rewind($streamVerboseHandle);
$verboseLog = stream_get_contents($streamVerboseHandle);

echo "Подробная информация cUrl:\n", 
     "<pre>", htmlspecialchars($verboseLog), "</pre>\n";

(Я изначально ответил аналогично, но более подробно в связанном вопросе.)

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

$version = curl_version();
extract(curl_getinfo($curlHandle));
$metrics = <<<EOD
URL....: $url
Код...: $http_code ($redirect_count редиректов за $redirect_time секунд)
Контент: $content_type Размер: $download_content_length (Собственный: $size_download) Время файла: $filetime
Время...: $total_time Начало @ $starttransfer_time (DNS: $namelookup_time Подключение: $connect_time Запрос: $pretransfer_time)
Скорость..: Вниз: $speed_download (сред.) Вверх: $speed_upload (сред.)
Curl...: v{$version['version']}
EOD;

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

curl_setopt($curlhandle, CURLOPT_VERBOSE, true);

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

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

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

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

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

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

( Читайте на http://curl.haxx.se/mail/curlphp-2008-03/0064.html )

Вот еще более простой способ, записывая напрямую в вывод ошибок php:

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

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

$response = curl_exec($ch);

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

Если вам просто нужен очень быстрый способ отладки результата:

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

Выводите информацию об отладке в STDERR:

$curlHandler = curl_init();

curl_setopt_array($curlHandler, [
    CURLOPT_URL => 'https://postman-echo.com/get?foo=bar',
    CURLOPT_RETURNTRANSFER => true,

    /**
     * Укажите опцию отладки
     */
    CURLOPT_VERBOSE => true,
]);

curl_exec($curlHandler);

curl_close($curlHandler);

Выводите информацию об отладке в файл:

$curlHandler = curl_init();

curl_setopt_array($curlHandler, [
    CURLOPT_URL => 'https://postman-echo.com/get?foo=bar',
    CURLOPT_RETURNTRANSFER => true,

    /**
     * Укажите опцию отладки.
     */
    CURLOPT_VERBOSE => true,

    /**
     * Укажите файл для записи лога.
     * Убедитесь, что папка доступна для записи.
     */
    CURLOPT_STDERR => fopen('./curl.log', 'w+'),
]);

curl_exec($curlHandler);

curl_close($curlHandler);

Смотрите https://github.com/andriichuk/php-curl-cookbook#debug-request

Другой (грубый) вариант — использовать netcat для вывода полного запроса:

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

И, конечно, отправить неудачный запрос на него:

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

Заметьте, что это всегда будет зависать и завершаться ошибкой, поскольку netcat никогда не создаст корректный HTTP-ответ. Это действительно только для того, чтобы проверить, что было отправлено. Более лучший вариант, конечно, использование сервиса отладки HTTP-запросов.

Ответ или решение

Отладка cURL в PHP: Подходы и Рекомендации

Отладка cURL в PHP — это важный аспект разработки, особенно когда необходимо отследить, какие данные отправляются на сервер. Чтобы получить представление о полях POST-запроса перед его отправкой, можно воспользоваться несколькими методами, о которых мы подробно поговорим далее.

1. Использование CURLOPT_VERBOSE

Одним из самых эффективных способов получения детальной информации о запросе является использование опции CURLOPT_VERBOSE. Эта опция позволяет вывести информацию о cURL-запросе в поток вывода ошибок (STDERR) или в указанный файл. Вот как это сделать:

$curlHandle = curl_init();
curl_setopt($curlHandle, CURLOPT_URL, 'https://example.com/api');
curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, true);

// Включаем подробный вывод
curl_setopt($curlHandle, CURLOPT_VERBOSE, true);

$streamVerboseHandle = fopen('php://temp', 'w+');
curl_setopt($curlHandle, CURLOPT_STDERR, $streamVerboseHandle);

$response = curl_exec($curlHandle);
if ($response === false) {
    echo "cURL Error: " . curl_error($curlHandle);
}

// Чтение подробной информации
rewind($streamVerboseHandle);
$verboseLog = stream_get_contents($streamVerboseHandle);

echo "cURL verbose information:\n<pre>" . htmlspecialchars($verboseLog) . "</pre>\n";

curl_close($curlHandle);

Этот код не только отправляет запрос, но и выводит информацию о нем, включая заголовки и данные, которые отправляются.

2. Получение информации о запросе с помощью curl_getinfo

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

$info = curl_getinfo($curlHandle);
var_dump($info);

Эта функция возвращает массив с различной информацией о последнем запросе, что может быть полезно для отладки.

3. Запись в файл для последующего анализа

Если вам необходимо сохранить подробности запроса для более позднего анализа, можно использовать следующий пример кода:

$fp = fopen('curl.log', 'w+'); // Открываем файл для записи
curl_setopt($curlHandle, CURLOPT_VERBOSE, true);
curl_setopt($curlHandle, CURLOPT_STDERR, $fp);

$response = curl_exec($curlHandle);
curl_close($curlHandle);
fclose($fp);

С помощью этого подхода вся информация о запросе будет записана в файл curl.log, с которым вы сможете работать позже.

4. Использование инструментов для мониторинга трафика

Для более глубокой отладки вы можете также воспользоваться инструментами анализа трафика, такими как Wireshark или tcpdump. Эти инструменты позволяют захватывать сетевой трафик и анализировать отправляемые и получаемые данные на уровне пакетов.

5. Использование nc (netcat) для отладки

Если вы хотите увидеть, что именно отправляется, можно использовать утилиту netcat. Например:

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

Затем вы можете отправить cURL-запрос на http://localhost:8000, чтобы увидеть, какие данные отправляются. Однако будьте осторожны — этот метод всегда будет зависать, поскольку netcat не сможет сформировать действительный HTTP-ответ.

6. Использование тестовых серверов

Существуют специализированные тестовые серверы, которые могут откликаться на HTTP-запросы, что позволяет вам анализировать запросы. Например, вы можете использовать Postman Echo, который возвращает данные, отправленные в запросе:

curl_setopt($curlHandle, CURLOPT_URL, 'https://postman-echo.com/post');

Заключение

Дебаггинг cURL в PHP может быть реализован несколькими способами, включая использование опций CURLOPT_VERBOSE и curl_getinfo, а также внешние инструменты для мониторинга. Применение данных методов позволит получить необходимую информацию для устранения неполадок и оптимизации ваших cURL-запросов. Не забывайте также использовать тестовые серверы для проверки отправляемых данных.

Оцените материал
Добавить комментарий

Капча загружается...