Intereting Posts
Конструкция динамического класса Php PHP – включена функция «включить»? Заказать массив по значению ключа Как загружать встроенные изображения с помощью пакетного запроса Graph API? Как использовать рекурсивный итератор массива для обработки многомерного массива? Добавление пользователей в группу интересов через MailChimp API версии 2.0 Рекурсивное обход дерева с помощью mysql через PHP PHP не может загрузить расширение php_curl.dll PHP конвертирует datetime в несколько секунд Почему `intval (19.9 * 100)` равно `1989`? Являются объектами PHP Closure, подходящими для сбора мусора php не анализирует данные из данных формы multipart / form-data, отправленных ajax как написать интерактивный php-скрипт командной строки? Как проверить, вошел ли пользователь в php? Разрешение неправильной кодировки символов при отображении результатов базы данных MySQL после обновления до PHP 5.3

Сделать вывод CURL STDERR в файл (или строку)

Мы пытаемся отладить некоторые ошибки cURL на сервере, и я бы хотел увидеть журнал STDERR. В настоящее время мы видим, что наша ошибка – «код ошибки: 7», и мы не можем подключиться к целевому серверу. Мы связались с хостом и сделали специальное правило, чтобы открыть порт, который нам нужен, и мы пока игнорируем сертификат.

Тем не менее, мы не можем подключиться. Мне нужно отладить это, но я не вижу никакой соответствующей информации на моем конце.

Я думаю, что строки, обозначающие «VERBOSE» и «STDERR», являются самыми важными. Ничего не написано в $ curl_log. Что я делаю не так? Следуя логике руководств, это должно быть правильно …

Используемый PHP:

<?php $curl = curl_init(); $curl_log = fopen("curl.txt", 'w'); $url = "http://www.google.com"; curl_setopt_array($curl, array( CURLOPT_URL => $url, // Our destination URL CURLOPT_VERBOSE => 1, // Logs verbose output to STDERR CURLOPT_STDERR => $curl_log, // Output STDERR log to file CURLOPT_SSL_VERIFYPEER => 0, // Do not verify certificate CURLOPT_FAILONERROR => 0, // true to fail silently for http requests > 400 CURLOPT_RETURNTRANSFER => 1 // Return data received from server )); $output = fread($curl_log, 2048); echo $output; // This returns nothing! fclose($curl_log); $response = curl_exec($curl); //...restofscript... ?> 

Из руководства PHP: http://php.net/manual/en/function.curl-setopt.php

CURLOPT_VERBOSE TRUE для вывода подробной информации. Записывает вывод в STDERR CURLOPT_STDERR Альтернативное место для вывода ошибок вместо STDERR.

Это тоже не проблема разрешения. Я установил права на файлы и сценарии на 777 на стороне сервера, а мой локальный клиент – это окна и никогда не заботился о настройках разрешений (это все равно для dev).

Solutions Collecting From Web of "Сделать вывод CURL STDERR в файл (или строку)"

Вы делаете ошибки в вашем примере:

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

2) вы открываете $curl_log = fopen("curl.txt", 'w'); только для записи, поэтому ничего нельзя прочитать, даже после того, как вы напишете файл и перемотаете внутренний указатель файла.

Поэтому правильный укороченный код должен выглядеть так:

 <?php $curl = curl_init(); $curl_log = fopen("curl.txt", 'rw'); // open file for READ and write $url = "http://www.google.com"; curl_setopt_array($curl, array( CURLOPT_URL => $url, CURLOPT_VERBOSE => 1, CURLOPT_STDERR => $curl_log, CURLOPT_RETURNTRANSFER => 1 )); $response = curl_exec($curl); rewind($curl_log); $output= fread($curl_log, 2048); echo "<pre>". print_r($output, 1). "</pre>"; fclose($curl_log); // ... ?> 

ПРИМЕЧАНИЕ. Подробный журнал может быть длиннее 2048 байт, поэтому вы можете «fclose» $ curl_log после curl_exec (), а затем прочитать весь файл, например, file_get_contents (). В этом случае точка 2) не должна рассматриваться как ошибка 🙂

Немного поздно на вечеринку, но эта страница по-прежнему всплывает высоко в Google, так что давайте пойдем.

Кажется, что CURLOPT_VERBOSE ничего не записывает, если для CURLINFO_HEADER_OUT также установлено значение TRUE.

Это ошибка в PHP ( # 65348 ), и по причинам, которые они решили не исправлять.

Помещая al выше ответы вместе, я использую эту функцию, чтобы сделать запрос Curl Post с параметром loggin для файла:

 function CURLPostRequest($url, array $post = NULL, array $options = array(), $log_file = NULL){ $defaults = array( CURLOPT_POST => 1, CURLOPT_HEADER => 0, CURLOPT_URL => $url, CURLOPT_FRESH_CONNECT => 1, CURLOPT_RETURNTRANSFER => 1, CURLOPT_FORBID_REUSE => 1, CURLOPT_TIMEOUT => 4, CURLOPT_POSTFIELDS => http_build_query($post) ); if (is_resource($log_file)){ $defaults[CURLOPT_VERBOSE]=1; $defaults[CURLOPT_STDERR]=$log_file; $defaults[CURLINFO_HEADER_OUT]=1; } $ch = curl_init(); curl_setopt_array($ch, ($options + $defaults)); if( ! $result = curl_exec($ch)){ throw new Exception(curl_error($ch)); } if (is_resource($log_file)){ $info = curl_getinfo($ch); if (isset($info['request_header'])){ fwrite($log_file, PHP_EOL.PHP_EOL.'* POST Content'.PHP_EOL.PHP_EOL); fwrite($log_file, print_r($info['request_header'],true)); fwrite($log_file, http_build_query($post)); } fwrite($log_file, PHP_EOL.PHP_EOL.'* Response Content'.PHP_EOL.PHP_EOL); fwrite($log_file, $result.PHP_EOL.PHP_EOL); } curl_close($ch); return $result; } по function CURLPostRequest($url, array $post = NULL, array $options = array(), $log_file = NULL){ $defaults = array( CURLOPT_POST => 1, CURLOPT_HEADER => 0, CURLOPT_URL => $url, CURLOPT_FRESH_CONNECT => 1, CURLOPT_RETURNTRANSFER => 1, CURLOPT_FORBID_REUSE => 1, CURLOPT_TIMEOUT => 4, CURLOPT_POSTFIELDS => http_build_query($post) ); if (is_resource($log_file)){ $defaults[CURLOPT_VERBOSE]=1; $defaults[CURLOPT_STDERR]=$log_file; $defaults[CURLINFO_HEADER_OUT]=1; } $ch = curl_init(); curl_setopt_array($ch, ($options + $defaults)); if( ! $result = curl_exec($ch)){ throw new Exception(curl_error($ch)); } if (is_resource($log_file)){ $info = curl_getinfo($ch); if (isset($info['request_header'])){ fwrite($log_file, PHP_EOL.PHP_EOL.'* POST Content'.PHP_EOL.PHP_EOL); fwrite($log_file, print_r($info['request_header'],true)); fwrite($log_file, http_build_query($post)); } fwrite($log_file, PHP_EOL.PHP_EOL.'* Response Content'.PHP_EOL.PHP_EOL); fwrite($log_file, $result.PHP_EOL.PHP_EOL); } curl_close($ch); return $result; } по function CURLPostRequest($url, array $post = NULL, array $options = array(), $log_file = NULL){ $defaults = array( CURLOPT_POST => 1, CURLOPT_HEADER => 0, CURLOPT_URL => $url, CURLOPT_FRESH_CONNECT => 1, CURLOPT_RETURNTRANSFER => 1, CURLOPT_FORBID_REUSE => 1, CURLOPT_TIMEOUT => 4, CURLOPT_POSTFIELDS => http_build_query($post) ); if (is_resource($log_file)){ $defaults[CURLOPT_VERBOSE]=1; $defaults[CURLOPT_STDERR]=$log_file; $defaults[CURLINFO_HEADER_OUT]=1; } $ch = curl_init(); curl_setopt_array($ch, ($options + $defaults)); if( ! $result = curl_exec($ch)){ throw new Exception(curl_error($ch)); } if (is_resource($log_file)){ $info = curl_getinfo($ch); if (isset($info['request_header'])){ fwrite($log_file, PHP_EOL.PHP_EOL.'* POST Content'.PHP_EOL.PHP_EOL); fwrite($log_file, print_r($info['request_header'],true)); fwrite($log_file, http_build_query($post)); } fwrite($log_file, PHP_EOL.PHP_EOL.'* Response Content'.PHP_EOL.PHP_EOL); fwrite($log_file, $result.PHP_EOL.PHP_EOL); } curl_close($ch); return $result; } по function CURLPostRequest($url, array $post = NULL, array $options = array(), $log_file = NULL){ $defaults = array( CURLOPT_POST => 1, CURLOPT_HEADER => 0, CURLOPT_URL => $url, CURLOPT_FRESH_CONNECT => 1, CURLOPT_RETURNTRANSFER => 1, CURLOPT_FORBID_REUSE => 1, CURLOPT_TIMEOUT => 4, CURLOPT_POSTFIELDS => http_build_query($post) ); if (is_resource($log_file)){ $defaults[CURLOPT_VERBOSE]=1; $defaults[CURLOPT_STDERR]=$log_file; $defaults[CURLINFO_HEADER_OUT]=1; } $ch = curl_init(); curl_setopt_array($ch, ($options + $defaults)); if( ! $result = curl_exec($ch)){ throw new Exception(curl_error($ch)); } if (is_resource($log_file)){ $info = curl_getinfo($ch); if (isset($info['request_header'])){ fwrite($log_file, PHP_EOL.PHP_EOL.'* POST Content'.PHP_EOL.PHP_EOL); fwrite($log_file, print_r($info['request_header'],true)); fwrite($log_file, http_build_query($post)); } fwrite($log_file, PHP_EOL.PHP_EOL.'* Response Content'.PHP_EOL.PHP_EOL); fwrite($log_file, $result.PHP_EOL.PHP_EOL); } curl_close($ch); return $result; } 

Надеюсь, эта помощь кому-то.

Из руководства php для функции curl_setopt:

 CURLOPT_FILE The file that the transfer should be written to. The default is STDOUT (the browser window). 

Вы должны положить

 $output = fread($curl_log, 2048); echo $output; // This returns nothing! fclose($curl_log); 

после $response = curl_exec($curl); в противном случае файл закрывается во время выполнения curl.