2010-11-11 4 views
1

Im строит функцию проверки ссылок, которая проверяет, имеет ли ссылка код 200/301/302.Проверка связи с помощью Multi-Curl

Я хочу проверить около 1000 ссылок, поэтому я использовал функцию Multi-CURL, и я получаю все заголовки, коды, URL-адрес, на который перенаправлен URL-адрес.

Проблема заключается в том, что Multi-CURL выполняет параллельное добавление всех URL-адресов curl_multi_add_handle и возвращает полученные результаты и игнорирует остальные.

Я знаю из заголовка, результат которого я вернул, но я не знаю, какой URL-адрес привел его. Есть ли идентификатор, который URL-адрес я запросил у конкретного обработанного дескриптора (может быть, это связано с curl_multi_info_read)?

Вот мой код:

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

      for($i = 0; $i < $node_count; $i++) { 

      $curl_arr[$i] = curl_init($curls[$i][0]); 
      curl_setopt($curl_arr[$i],CURLOPT_FRESH_CONNECT,true); 
      curl_setopt($curl_arr[$i],CURLOPT_CONNECTTIMEOUT,10); 
      curl_setopt($curl_arr[$i],CURLOPT_HEADER,true); 
      curl_setopt($curl_arr[$i],CURLOPT_CUSTOMREQUEST,'HEAD'); 
      curl_setopt($curl_arr[$i],CURLOPT_RETURNTRANSFER,true); 
      curl_setopt($curl_arr[$i],CURLOPT_NOBODY,true); 
      curl_setopt($curl_arr[$i],CURLOPT_AUTOREFERER, 1); 
      curl_setopt($curl_arr[$i],CURLOPT_TIMEOUT,30); 

      curl_multi_add_handle($master, $curl_arr[$i]); 
      } 


      $finalresult = array(); 

      do{ 

      curl_multi_exec($master, $running); 
      $info = curl_multi_info_read($master); 

      if($info['handle']) { 
       $finalresult[] = curl_multi_getcontent($info['handle']); 
       curl_multi_remove_handle($master, $info['handle']); 
      } 

      $previousActive = $running; 
      } 
      while($running > 0); 

      curl_multi_close($master); 

Цените Help.Thanx.

ответ

1

Я решил его решить - его возвращенный заказ, который важно понимать и сочетать с результатом. Для кого-то, кто может найти ответ:

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

     for($i = 0; $i < $node_count; $i++) { 

     $curl_arr[$i] = curl_init($curls[$i][0]); 
     curl_setopt($curl_arr[$i],CURLOPT_FRESH_CONNECT,true); 
     curl_setopt($curl_arr[$i],CURLOPT_CONNECTTIMEOUT,10); 
     curl_setopt($curl_arr[$i],CURLOPT_HEADER,true); 
     curl_setopt($curl_arr[$i],CURLOPT_CUSTOMREQUEST,'HEAD'); 
     curl_setopt($curl_arr[$i],CURLOPT_RETURNTRANSFER,true); 
     curl_setopt($curl_arr[$i],CURLOPT_NOBODY,true); 
     curl_setopt($curl_arr[$i],CURLOPT_AUTOREFERER, 1); 
     curl_setopt($curl_arr[$i],CURLOPT_TIMEOUT,30); 

     curl_multi_add_handle($master, $curl_arr[$i]); 
     } 



      $finalresult = array(); 
      $returnedOrder = array(); 

      do{ 

      curl_multi_exec($master, $running); 
      $info = curl_multi_info_read($master); 

      if($info['handle']) { 
       $finalresult[] = curl_multi_getcontent($info['handle']); 
       $returnedOrder[] = array_search($info['handle'], $curl_arr, true); 
       curl_multi_remove_handle($master, $info['handle']); 
       curl_close($curl_arr[end($returnedOrder)]); 
      } 

      $previousActive = $running; 
      } 
      while($running > 0); 

      $res = array_combine($returnedOrder, $finalresult); 
      curl_multi_close($master); 
+0

Благодарим за сообщение об этом ответе. У меня была такая же проблема, как выяснить порядок. – Shawn

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