CURLOPT_NOBODY и прокси

Статус
В этой теме нельзя размещать новые ответы.

Zeratul

Создатель
Регистрация
17 Мар 2006
Сообщения
1.321
Реакции
5.595
Столкнулся с новой проблемкой. Она актуальна и при мультипоточном использовании.

Условия:

  • CURLOPT_NOBODY - TRUE
  • CURLOPT_PROXY (Тип прокси не важен)
Вот тестовый код:
PHP:
$conn = curl_init('http://yandex.ru/robots.txt');
curl_setopt($conn, CURLOPT_HEADER, TRUE);
curl_setopt($conn, CURLOPT_NOBODY, TRUE);
curl_setopt($conn, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
curl_setopt($conn, CURLOPT_PROXY, '255.255.255.255:8080');
echo curl_exec($conn), PHP_EOL, echo curl_getinfo($conn, CURLINFO_HTTP_CODE);
Нет возможности получить код ответа сервера.
Установка CURLOPT_HEADER ничего не меняет, т.к хедеры все равно не отдает.
Без проксей все нормально работает. С проксями - никак.

Каюсь - все серваки пока на 5.2, но я думаю дело здесь вообще в курле, а не в PHP.
Но все же тесты с другими версиями PHP могут помочь.

PS: Естественно есть ещё 500 способов получить хедеры, но при этом курл предпочтителен по причине прозрачной работы с HTTPS и проксями.
Использовать сокеты+прокси+https "сделанные руками" является верхом извращенства в данном случае.
 
PHP:
$conn = curl_init('http://yandex.ru/robots.txt');
curl_setopt($conn, CURLOPT_HEADER, 1);
curl_setopt($conn, CURLOPT_NOBODY, 1);
curl_setopt($conn, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
curl_setopt($conn, CURLOPT_PROXY, '82.189.48.36:8080');

curl_setopt($conn, CURLOPT_USERAGENT , 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3');

echo PHP_EOL.'Статус удачного выполнения запроса: '.curl_exec($conn).PHP_EOL;
echo 'Код ответа сервера: '.curl_getinfo($conn, CURLINFO_HTTP_CODE);

Добавил CURLOPT_USERAGENT, ибо без него у многих серверов вопросы возникают не нужные.

Ответ сервера с CURLOPT_NOBODY = 1:
HTML:
HTTP/1.0 200 OK
Date: Tue, 21 Dec 2010 10:30:58 GMT
Server: Apache/2.2.9 (Unix) mod_perl/2.0.4 Perl/v5.8.8
Last-Modified: Wed, 12 May 2010 13:50:47 GMT
ETag: "24dcab-57-48665edd7bbc0"
Accept-Ranges: bytes
Content-Length: 87
Vary: Accept-Encoding
Content-Type: text/plain
X-Cache: MISS from barracuda.sperinter.locale
Via: 1.0 barracuda.sperinter.locale:8080 (http_scan/4.0.2.6.19)
Proxy-Connection: keep-alive


Статус удачного выполнения запроса: 1
Код ответа сервера: 200


Ответ сервера с CURLOPT_NOBODY = 0:
HTML:
HTTP/1.0 200 OK
Date: Tue, 21 Dec 2010 10:32:12 GMT
Server: Apache/2.2.9 (Unix) mod_perl/2.0.4 Perl/v5.8.8
Last-Modified: Wed, 12 May 2010 13:50:49 GMT
ETag: "44ba5b-57-48665edf64040"
Accept-Ranges: bytes
Content-Length: 87
Vary: Accept-Encoding
Content-Type: text/plain
X-Cache: MISS from barracuda.sperinter.locale
Via: 1.0 barracuda.sperinter.locale:8080 (http_scan/4.0.2.6.19)
Proxy-Connection: keep-alive

User-Agent: *
Allow: /$
Allow: /search/advanced$
Allow: /search/advanced/$
Disallow: /

Статус удачного выполнения запроса: 1
Код ответа сервера: 200

В общем возвращает, возможно вопрос в стоит в стабильности прокси, пробовал 3 штуки:
1) 10 попыток, возвращала удачный результат через раз
2) 10 попыток, 1 удачный результат
3) 10 попыток, вернула уданый результат в 8 случаях


PHP Version 5.3.3
cURL Version 7.20.0
 
В стабильности прокси проблем нет.
Т.е если убрать CURLOPT_NOBODY, то результат каждый раз возвращает правильный.

Видимо проблема всетаки в PHP 5.2. Обновлюсь - попробую, отпишу здесь.
 
В стабильности прокси проблем нет.
Т.е если убрать CURLOPT_NOBODY, то результат каждый раз возвращает правильный.
Видимо проблема всетаки в PHP 5.2. Обновлюсь - попробую, отпишу здесь.

Нет просто привел ответ сервера с CURLOPT_NOBODY = 1 и CURLOPT_NOBODY = 0 , то есть в обоих случаях есть корректный ответ от сервера.

Менял 3 раза прокси , что с CURLOPT_NOBODY = 1, что с CURLOPT_NOBODY = 0, сервер отвечал корректно но не всегда (см. результаты в предыдущем моем посте). Ответы сервера просто привел для примера.

Кстати все это дело запускалось на Денвере 3
 
Посмотрел на разных версиях 5.2 и 5.3 апач 2. Всё в норме.:nezn: Вообще курл- это отдельная песня. Порой выдаёт весьма странные результаты.
Попробуй вынуть заголовок через функцию:
PHP:
echo "PROXY \n\n";

$HEADER = '';
function saveHeader($conn, $string){
    global $HEADER; 
    $length = strlen($string);
    $HEADER .= $string;
    return $length;
} 

$conn = curl_init('http://yandex.ru/robots.txt');
curl_setopt($conn, CURLOPT_HEADER, TRUE);
curl_setopt($conn, CURLOPT_NOBODY, TRUE);
curl_setopt($conn, CURLOPT_RETURNTRANSFER, true);
curl_setopt($conn, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
curl_setopt($conn, CURLOPT_HEADERFUNCTION, 'saveHeader');
curl_setopt($conn, CURLOPT_PROXY, '41.190.16.17:8080');
curl_exec($conn);
var_dump($HEADER);
 
Честно говоря с курлом интересная магия. Но судя по сегодняшним тестам на трех серверах (PHP 5.1, 5.2 и 5.3), то вероятно, это особенность сокс сервиса из правой панели :)

Мне казалось что я действительно проверил разные варианты.
Но оказалось, что это не так. В данный момент результат такой:
Если использовать прокси как HTTP (CURLPROXY_HTTP), то ничего не работает.
А вот если как SOCKS4/5, то сейчас все работает.

Честно говоря естьощущение, что это связано с фазами луны, т.к вроде бы проверял в прошлый раз - и ни один вариант не работал.
Спасибо за ответы, но тему пока закрою. Если проблема повториться - то открою и буду копать более детальнее.

PS: Я даже почти полностью уверен, что ошибка в обработке запроса хедеров на боте, т.к проверил через сквид и самопал.
С хедерами все работает.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху