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