CURLOPT_NOBODY и прокси

Тема в разделе "PHP Pro", создана пользователем Zeratul, 21 дек 2010.

Статус темы:
Закрыта.
  1. Zeratul

    Zeratul Создатель

    Регистр.:
    17 мар 2006
    Сообщения:
    1.322
    Симпатии:
    3.857
    Столкнулся с новой проблемкой. Она актуальна и при мультипоточном использовании.

    Условия:

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

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

    PS: Естественно есть ещё 500 способов получить хедеры, но при этом курл предпочтителен по причине прозрачной работы с HTTPS и проксями.
    Использовать сокеты+прокси+https "сделанные руками" является верхом извращенства в данном случае.
     
  2. trooll

    trooll PHP кодер

    Регистр.:
    22 дек 2008
    Сообщения:
    503
    Симпатии:
    116
    PHP:
    $conn curl_init('http://yandex.ru/robots.txt');
    curl_setopt($connCURLOPT_HEADER1);
    curl_setopt($connCURLOPT_NOBODY1);
    curl_setopt($connCURLOPT_PROXYTYPECURLPROXY_HTTP);
    curl_setopt($connCURLOPT_PROXY'82.189.48.36:8080');

    curl_setopt($connCURLOPT_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($connCURLINFO_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
     
  3. Zeratul

    Zeratul Создатель

    Регистр.:
    17 мар 2006
    Сообщения:
    1.322
    Симпатии:
    3.857
    В стабильности прокси проблем нет.
    Т.е если убрать CURLOPT_NOBODY, то результат каждый раз возвращает правильный.

    Видимо проблема всетаки в PHP 5.2. Обновлюсь - попробую, отпишу здесь.
     
  4. trooll

    trooll PHP кодер

    Регистр.:
    22 дек 2008
    Сообщения:
    503
    Симпатии:
    116
    Нет просто привел ответ сервера с CURLOPT_NOBODY = 1 и CURLOPT_NOBODY = 0 , то есть в обоих случаях есть корректный ответ от сервера.

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

    Кстати все это дело запускалось на Денвере 3
     
  5. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    890
    Симпатии:
    558
    Посмотрел на разных версиях 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($connCURLOPT_HEADERTRUE);
    curl_setopt($connCURLOPT_NOBODYTRUE);
    curl_setopt($connCURLOPT_RETURNTRANSFERtrue);
    curl_setopt($connCURLOPT_PROXYTYPECURLPROXY_HTTP);
    curl_setopt($connCURLOPT_HEADERFUNCTION'saveHeader');
    curl_setopt($connCURLOPT_PROXY'41.190.16.17:8080');
    curl_exec($conn);
    var_dump($HEADER);
     
  6. Zeratul

    Zeratul Создатель

    Регистр.:
    17 мар 2006
    Сообщения:
    1.322
    Симпатии:
    3.857
    Честно говоря с курлом интересная магия. Но судя по сегодняшним тестам на трех серверах (PHP 5.1, 5.2 и 5.3), то вероятно, это особенность сокс сервиса из правой панели :)

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

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

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