2014-10-29 4 views
0

Я пытаюсь реализовать некоторые функции multi cURL вместо простых функций cURL.Восстановление скрипта от cURL до multi cURL

У меня есть следующий фрагмент кода:

$curl = curl_init(); 
     curl_setopt($curl, CURLOPT_ENCODING,'gzip'); 
     curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); 
     curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
     curl_setopt($curl, CURLOPT_URL, $url); 
     $result = curl_exec($curl); 
     curl_close($curl); 
     $rv = ($returnArray) ? json_decode($result, true) : json_decode($result); 

Это дает мне результаты (успех $ возвращающий результат и некоторые данные). Я хочу переписать его для использования curl_multi_init(). Я пробовал:

$curl = curl_init(); 
     curl_setopt($curl, CURLOPT_ENCODING,'gzip'); 
     curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); 
     curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
     curl_setopt($curl, CURLOPT_URL, $url); 
     $mh = curl_multi_init(); 
     curl_multi_add_handle($mh,$curl); 


     $running= \null; 
     do { 
      curl_multi_exec($mh,$running); 
      $result = curl_multi_exec($mh,$running); 
     } while($running > 0); 
     curl_multi_remove_handle($mh, $curl); 

     curl_multi_close($mh); 
     $rv = ($returnArray) ? json_decode($result, true) : json_decode($result); 

Я не получаю результатов ($ result is empty). У меня нет никаких ошибок. Что не так?

+0

RTM: http://php.net/manual/en/function.curl-multi-exec.php - 'curl_multi_exec()' 'возвращает Int 'не массив результатов – AeroX

ответ

0

Это работает для меня:

function get_result($nodes) 
    { 
     $node_count = count($nodes); 

     $curl_arr = array(); 
     $master = curl_multi_init(); 

     for($i = 0; $i < $node_count; $i++) 
     { 
      $url = $nodes[$i]; 
      $curl_arr[$i] = curl_init($url); 
      curl_setopt($curl_arr[$i], CURLOPT_RETURNTRANSFER, true); 
      curl_setopt($curl_arr[$i], CURLOPT_CONNECTTIMEOUT, 10); 
      curl_setopt($curl_arr[$i], CURLOPT_TIMEOUT, 10); 
      curl_setopt($curl_arr[$i], CURLOPT_ENCODING, "gzip"); 
      curl_setopt($curl_arr[$i], CURLOPT_VERBOSE, true); 
      curl_setopt($curl_arr[$i], CURLOPT_USERAGENT, 'Mozilla/5.0'); 
      curl_setopt($curl_arr[$i], CURLOPT_FOLLOWLOCATION, true); 
      curl_setopt($curl_arr[$i], CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); 
      curl_multi_add_handle($master, $curl_arr[$i]); 
     } 

     do { 
      curl_multi_exec($master,$running); 
      curl_multi_select($master, 5.0); 
     } while($running > 0); 


     $output = ""; 
     for($i = 0; $i < $node_count; $i++) 
     { 
      $output .= curl_multi_getcontent($curl_arr[$i] ) . "<breaktag>"; 
      curl_multi_remove_handle($master, $curl_arr[$i]); 
      curl_close($curl_arr[$i]); 
     } 

     curl_multi_close($master); 

     return $output; 
    } 


    $nodes[] =() // your URLs 
    $responses = get_result($nodes); 
    $responses = explode("<breaktag>", $responses); //now responses is array of result 
+0

Спасибо за ответ, но я не могу использовать этот подход. Я должен строго назначить curl_multi_exec ($ mh, $ running) переменной $ result. Я не могу пойти слишком дико :( – Agrrr

Смежные вопросы