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