Как добавить проверку ответов сервера во многопоточном cURL?

Тема в разделе "Как сделать...", создана пользователем Sergo_Sev, 14 июн 2014.

  1. Sergo_Sev

    Sergo_Sev Творец

    Регистр.:
    14 июн 2008
    Сообщения:
    571
    Симпатии:
    187
    Нужно добавить проверку в скрипт - если сервер возвращает ошибку (например 502 и 404) то не записываем файл, а записываем только при получении ответа 200

    PHP:
    function multiRequest($data) {
    // Массив для ресурсов соединения
    $curls = array();
    // Массив для результатов
    $result = array();
    // Инициализация мульти запроса
    $mh curl_multi_init();
    // Задание параметров запроса
    foreach ($data as $id => $d)
    {

    $curls[$id] = curl_init();
    $url = (is_array($d) && !empty($d['url'])) ? $d['url'] : $d;
    curl_setopt($curls[$id], CURLOPT_URL,            $url);
    curl_setopt($curls[$id], CURLOPT_HEADER,         false);
    curl_setopt($curls[$id], CURLOPT_RETURNTRANSFERtrue);

    curl_multi_add_handle($mh$curls[$id]);


    }
    // Выполняем запрос пока есть соединения
    $running null;
    do
    {
    curl_multi_exec($mh$running);
    }
    while(
    $running 0);
    // Получаем данные и закрываем соединения


    foreach($curls as $url_id => $content)
    {

    $str curl_multi_getcontent($content);

            
    $file fopen($url_id'w');
            
    fwrite($file$str);
            
    fclose($file);

    }
    curl_multi_close($mh);
    return 
    $result;
    }





    $data = array(
      
    "AjdwhC4lGqY.jpg" => 'http://cs10656.vk.me/v10656915/3e4/AjdwhC4lGqY.jpg'// ФАЙЛ НЕ доступен
      
    "RULNqogANTU.jpg" => 'http://pp.vk.me/c9709/v9709308/49/RULNqogANTU.jpg',
    );

    $r multiRequest($data);

    Нашел вот такой пример, но так и не понял куда и как добавить проверку
    PHP:
    function get_web_page$url )
    {
      
    $ch curl_init$url );
      
    curl_setopt($chCURLOPT_RETURNTRANSFER1);   // возвращает веб-страницу
      
    $content curl_exec$ch );
      
    $err     curl_errno$ch );
      
    $errmsg  curl_error$ch );
      
    $header  curl_getinfo$ch );
      
    curl_close$ch );
      
    $header['errno']   = $err;
      
    $header['errmsg']  = $errmsg;
      
    $header['content'] = $content;
      return 
    $header;
    }


    $result get_web_page"http://cs10656.vk.me/v10656915/3e4/AjdwhC4lGqY.jpg" );
    if ((
    $result['errno'] != )||($result['http_code'] != 200)){
        echo 
    $result['errmsg'];
    }else{
        
    $page $result['content'];
        echo 
    $page;
    }
     
  2. murlo

    murlo Создатель

    Регистр.:
    8 июн 2006
    Сообщения:
    34
    Симпатии:
    33
    Не вникая вообще, а только в то что вы хотите. А то только проснулся.
    Вот так попробуйте
    PHP:
    foreach($curls as $url_id => $content){
          
    $str curl_multi_getcontent($content);
          
    $header curl_getinfo($content);
          if(
    $header['http_code'] == 502 or $header['http_code'] == 404) continue;
          
    $file fopen($url_id'w');
          
    fwrite($file$str);
          
    fclose($file);
    }
     
    Sergo_Sev нравится это.