Какие шаги вы предпринимаете для устранения проблем с PHP cURL?

Практически любой рабочий PHP-программист столкнулся с необходимостью использовать CURL для отправки необработанных HTTP-запросов, будь то для обработки платежей по кредитным картам, гнусного скрипирования экрана или чего-то промежуточного.

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

Когда cURL не работает для вас, какие методы устранения неполадок вы используете, чтобы понять, почему он не работает? С какими странными ошибками вы сталкиваетесь с реализацией curl PHP? Если кто-то задает вопрос «HALP MY CURL IZ BROKEN» на форуме, каковы шаги, которые вы предпринимаете, чтобы выяснить, почему их запрос не работает?

Я считаю, что опция CURLINFO_HEADER_OUT очень полезна.

  <? PHP
 $ curl = curl_init ('http://www.php.net');

 curl_setopt ($ curl, CURLOPT_HEADERFUNCTION, 'dbg_curl_data');
 curl_setopt ($ curl, CURLOPT_WRITEFUNCTION, 'dbg_curl_data');
 curl_setopt ($ curl, CURLINFO_HEADER_OUT, true);

 curl_exec ($ завиток);

 echo '<fieldset> <legend> заголовки запросов </ legend>
   <pre> ', htmlspecialchars (curl_getinfo ($ curl, CURLINFO_HEADER_OUT)),' </ pre>
 </ FIELDSET> ';

 echo '<fieldset> <legend> ответ </ legend>
   <pre> ', htmlspecialchars (dbg_curl_data (null)),' </ pre>
 </ FIELDSET> ';

 function dbg_curl_data ($ curl, $ data = null) {
   static $ buffer = '';

   if (is_null ($ curl)) {
     $ r = $ buffer;
     $ buffer = '';
     return $ r;
   }
   else {
     $ buffer. = $ data;
     return strlen ($ data);
   }
 } 

На самом деле, я никогда не использую CURL (в php). PHP-поток api намного опережает и может также использоваться для данных POST. У Wez Furlong есть статья об этом.

Если бы я его использовал? Я бы начал с включения всех сообщений (настройка сообщений об ошибках на E_ALL). Если я нахожу, что PHP не говорит мне, что мне нужно в сообщениях об ошибках, я бы, вероятно, использовал прокси-подход, чтобы посмотреть, что происходит на самом деле. Изменение целевого URL-адреса на локальную php-страницу, содержащую что-то вроде

 <?php var_dump($_POST); var_dump($_GET); var_dump($_SERVER); 

это один из способов. Другой способ – использовать утилиту netcat для прослушивания на порту 80 и отправить туда запрос:

 netcat -l -p 80 

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

Вы также можете получить заголовки из PHP с помощью функции apache_request_headers () . В большинстве случаев я предпочитаю подход netcat, хотя, так как он гарантирует, что я вижу неизмененную правду, а также отображаю исходные данные.