2010-04-22 7 views
10

Tu jest mój bieżący kod:Jak mogę użyć cURL do otwarcia wielu adresów jednocześnie z PHP?

$SQL = mysql_query("SELECT url FROM urls") or die(mysql_error()); //Query the urls table 
while($resultSet = mysql_fetch_array($SQL)){ //Put all the urls into one variable 

       // Now for some cURL to run it. 
      $ch = curl_init($resultSet['url']); //load the urls 
      curl_setopt($ch, CURLOPT_TIMEOUT, 2); //No need to wait for it to load. Execute it and go. 
      curl_exec($ch); //Execute 
      curl_close($ch); //Close it off 
     } //While loop 

Jestem stosunkowo nowy zwijają. Stosunkowo nowy, mam na myśli to, że po raz pierwszy używam cURL. Obecnie ładuje się jeden przez dwie sekundy, a następnie ładuje następny przez 2 sekundy, a następnie następny. jednak chcę, aby załadować wszystkie z nich w tym samym czasie. Jestem pewien, że jest to możliwe, po prostu nie jestem pewien, jak to zrobić. Jeśli ktoś mógłby wskazać mi właściwy kierunek, byłbym wdzięczny.

+0

Czy musisz zrobić coś z obciążeniami zwijającymi wyniki? –

+0

Nie. Nic. – Rob

Odpowiedz

8

Ustawiasz każdy uchwyt korby w ten sam sposób, a następnie dodajesz do uchwytu curl_multi_. Funkcje do obejrzenia to: curl_multi_* funkcje. Z mojego doświadczenia wynika jednak, że pojawiły się problemy z próbą załadowania zbyt wielu adresów URL naraz (chociaż nie mogę obecnie znaleźć na nich notatek), więc po raz ostatni użyłem curl_mutli_, ustawiłem go tak, aby wykonywał partie 5 adresów URL naraz.

edit: Tutaj jest zmniejszona wersja kodu I używając curl_multi_:

edycji: Nieco przerobione i wiele dodanych komentarzy, które mamy nadzieję pomogą.

// -- create all the individual cURL handles and set their options 
$curl_handles = array(); 
foreach ($urls as $url) { 
    $curl_handles[$url] = curl_init(); 
    curl_setopt($curl_handles[$url], CURLOPT_URL, $url); 
    // set other curl options here 
} 

// -- start going through the cURL handles and running them 
$curl_multi_handle = curl_multi_init(); 

$i = 0; // count where we are in the list so we can break up the runs into smaller blocks 
$block = array(); // to accumulate the curl_handles for each group we'll run simultaneously 

foreach ($curl_handles as $a_curl_handle) { 
    $i++; // increment the position-counter 

    // add the handle to the curl_multi_handle and to our tracking "block" 
    curl_multi_add_handle($curl_multi_handle, $a_curl_handle); 
    $block[] = $a_curl_handle; 

    // -- check to see if we've got a "full block" to run or if we're at the end of out list of handles 
    if (($i % BLOCK_SIZE == 0) or ($i == count($curl_handles))) { 
     // -- run the block 

     $running = NULL; 
     do { 
      // track the previous loop's number of handles still running so we can tell if it changes 
      $running_before = $running; 

      // run the block or check on the running block and get the number of sites still running in $running 
      curl_multi_exec($curl_multi_handle, $running); 

      // if the number of sites still running changed, print out a message with the number of sites that are still running. 
      if ($running != $running_before) { 
       echo("Waiting for $running sites to finish...\n"); 
      } 
     } while ($running > 0); 

     // -- once the number still running is 0, curl_multi_ is done, so check the results 
     foreach ($block as $handle) { 
      // HTTP response code 
      $code = curl_getinfo($handle, CURLINFO_HTTP_CODE); 

      // cURL error number 
      $curl_errno = curl_errno($handle); 

      // cURL error message 
      $curl_error = curl_error($handle); 

      // output if there was an error 
      if ($curl_error) { 
       echo(" *** cURL error: ($curl_errno) $curl_error\n"); 
      } 

      // remove the (used) handle from the curl_multi_handle 
      curl_multi_remove_handle($curl_multi_handle, $handle); 
     } 

     // reset the block to empty, since we've run its curl_handles 
     $block = array(); 
    } 
} 

// close the curl_multi_handle once we're done 
curl_multi_close($curl_multi_handle); 

Biorąc pod uwagę, że nie trzeba nic z powrotem z adresów URL, to prawdopodobnie nie trzeba wiele, co tam jest, ale to jest jak ja pakietowego wnioski na bloki BLOCK_SIZE, czekał na każdym bloku do uruchomione przed przejściem i przechwycone błędy z cURL.

+0

Cóż, wszystko, co mam zamiar zrobić, to załadować każdy adres URL (a adresy URL będą ładowane są puste strony, dostęp do adresów URL tylko uruchomić skrypt i sprawiają, że działa przez określony czas), a nie zapisać lub wyjście dowolne dane. Czy uważasz, że spowoduje to jakiekolwiek problemy w tym przypadku? – Rob

+0

Domyślam się, że nie będzie to w tym przypadku problemem, ale nie wiem na pewno - jeśli nie uruchomi się lub wystąpi błąd, gdy spróbujesz załadować wszystkie naraz, możesz umieścić licznik w pętli 'while' i ilekroć' counter% batch_size == 0' wewnątrz pętli, uruchom partię i wyczyść ją. – Isaac

+0

Woah. Nienawidzę przeszkadzać ci z tym, ale czy możesz skomentować kilka rzeczy w tym kodzie, abym mógł zobaczyć, co dokładnie robi? – Rob