Curl повторный запрос после таймаута, как?

Тема в разделе "Как сделать...", создана пользователем gauss_gauss, 14 янв 2012.

  1. gauss_gauss

    gauss_gauss Постоялец

    Регистр.:
    13 окт 2011
    Сообщения:
    87
    Симпатии:
    4
    Всем привет!
    Вопрос связан с работой cUrl

    Задача - парсинг страниц.
    Вопрос состоит в следующем: как повторить запрос cUrl к странице, у которой был таймаут соединения?

    код вполне себе обычный

    PHP:
    $ch curl_init($_POST['name']);
            
    curl_setopt($chCURLOPT_HEADER0);
            
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
            
    curl_setopt($chCURLOPT_TIMEOUT$timeout);
            
    curl_setopt($chCURLOPT_FOLLOWLOCATIONtrue);
            
    // Получаем html
            
    $result curl_exec($ch);
         
         
            
    //выведем ошибку, если есть
            
    if(curl_errno($ch))
                    {
                            echo 
    'HTTP code:' curl_getinfo($ch,CURLINFO_HTTP_CODE) . '<br>';
                            echo 
    'Curl error: ' curl_error($ch);
                    }
            
    curl_close($ch);
    при этом хттп код 200, то есть соединение состоялось как я понимаю,
    однако по истечении 7 секунд (мое значение $timeout), вылазит ошибка curl_error($ch) - ТАЙМАУТ
    причем она вылазит от случая к случаю (парсинг выполняю с localhost'a)
    каким образом можно повторить запрос cUrl к странице после этого таймаута n-ное количество раз?
    и почему может вылазить вылазить ошибка, которая говорит о таймауте, ведь из браузера страница всегда открывается на ура и полностью без проблем!!
     
  2. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    884
    Симпатии:
    540
    добавить цикл

    PHP:
    $all 0;
    for(
    $i=0$i<5; ++$i){
    $ch curl_init($_POST['name']);
    curl_setopt($chCURLOPT_HEADER0);
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
    curl_setopt($chCURLOPT_TIMEOUT$timeout);
    curl_setopt($chCURLOPT_FOLLOWLOCATIONtrue);
    // Получаем html
    $result curl_exec($ch);


    //выведем ошибку, если есть
    if(curl_errno($ch))
    {
    echo 
    'HTTP code:' curl_getinfo($ch,CURLINFO_HTTP_CODE) . '<br>';
    echo 
    'Curl error: ' curl_error($ch);
    if(...
    тут проверка на ошибкутайм аут404 и на любю другую ){
    continue;
    }
     
     }
     
    break;
    curl_close($ch);
    }
     
    Довольно топорно правда
     
    gauss_gauss нравится это.
  3. unsiker

    unsiker

    Регистр.:
    6 июн 2008
    Сообщения:
    465
    Симпатии:
    172
    внимайте мудрости, выдрал кусок рабочего кода:
    PHP:
    function browser($url) {
        
    $html "";
        
    $ch curl_init($url);
        
    curl_setopt($chCURLOPT_URL,$url);
        
    curl_setopt($chCURLOPT_RETURNTRANSFER,1);
        
    curl_setopt($chCURLOPT_FOLLOWLOCATIONTRUE);
        
    curl_setopt($chCURLOPT_USERAGENT"Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2");
     
        
    $html curl_exec($ch);
        
    $info curl_getinfo($ch);
        
    curl_close($ch);
     
        if (!(
    $html)){
            
    sleep(15);
            
    $html browser($url$reffer);
        }
     
        return 
    $html;
    }
    sleep(15) - задержка 15 секунд, можно поставить свое либо удалить
     
  4. cashmaniac

    cashmaniac Постоялец

    Регистр.:
    12 янв 2007
    Сообщения:
    64
    Симпатии:
    5
    не боишься, что процесс загнется от вечной рекурсии, при недоступности удаленного хоста? если ты его стартуешь по крону как-бы пофиг, а если он живет всегда - тогда ой
     
  5. unsiker

    unsiker

    Регистр.:
    6 июн 2008
    Сообщения:
    465
    Симпатии:
    172
    ничто не вечно под луной (с)