2010-11-11 5 views
1

Im construction d'une fonction Link Checker qui vérifie si le lien a le code 200/301/302. Je veux vérifier environ 1000 liens donc j'ai utilisé la fonctionnalité Multi-CURL et j'obtiens tous les en-têtes, codes, l'URL vers laquelle une URL redirigé.Contrôle de liaison avec multi-curl

Le problème est que Multi-CURL s'exécute en parallèle en ajoutant toutes les URL à curl_multi_add_handle et renvoie les résultats qu'il obtient et ignore le reste.

Je sais de l'en-tête quel résultat je suis revenu mais je ne sais pas quelle URL l'a amené. Existe-t-il un identifiant que l'URL que j'ai demandé pour un handle spécifique (peut-être quelque chose à voir avec curl_multi_info_read)?

Voici mon code:

$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); 

apprécier la Help.Thanx.

Répondre

1

Je l'ai résolu - C'est l'ordre retourné qui est important de comprendre et de combiner avec le résultat. Pour quelqu'un qui cherche peut-être la réponse:

 $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

Merci d'avoir posté cette réponse. J'avais le même problème de savoir comment comprendre l'ordre. – Shawn

Questions connexes