Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

Я считаю, что опция 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($curl);

echo '<fieldset><legend>request headers</legend>
  <pre>', htmlspecialchars(curl_getinfo($curl, CURLINFO_HEADER_OUT)), '</pre>
</fieldset>';

echo '<fieldset><legend>response</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);
  }
}

Ответ 2

На самом деле, я никогда не использую 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, тем не менее, поскольку он гарантирует, что я вижу неизмененную правду, а также отображаю исходные данные.