2010-04-22 4 views
10

Qui è il mio codice corrente:Come posso utilizzare cURL per aprire più URL contemporaneamente con 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 

Sono relativamente nuovo a riccio. Per relativamente nuovo, voglio dire, questa è la mia prima volta che utilizzo cURL. Attualmente carica uno per due secondi, quindi carica quello successivo per 2 secondi, quindi il successivo. tuttavia, voglio farlo caricare TUTTI allo stesso tempo. Sono sicuro che sia possibile, sono solo incerto su come. Se qualcuno potesse indicarmi la giusta direzione, lo apprezzerei.

+0

Avete bisogno di fare qualcosa con i carichi di arricciatura dei risultati? –

+0

No. Niente di niente. – Rob

risposta

8

È possibile impostare ciascun handle di cURL allo stesso modo, quindi aggiungerli a un handle curl_multi_. Le funzioni da osservare sono le funzioni curl_multi_*documented here. Nella mia esperienza, però, c'erano problemi nel provare a caricare troppi URL contemporaneamente (sebbene al momento non riesca a trovare i miei appunti su di esso), quindi l'ultima volta che ho usato curl_mutli_, l'ho configurato per fare lotti di 5 URL alla volta.

modificare: Ecco una versione ridotta del codice che ho con curl_multi_:

modificare: Leggermente riscritta e un sacco di commenti aggiunti, che si spera aiuteranno.

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

Dato che non hai bisogno di nulla in cambio da URL, probabilmente non avete bisogno di un sacco di ciò che c'è, ma questo è come mi divisi in blocchi le richieste in blocchi di BLOCK_SIZE, aspettato per ogni blocco di correre prima di andare avanti e catturare errori da cURL.

+0

Beh, tutto quello che ho intenzione di fare è caricare ogni url (e gli url che caricherà sono pagine vuote, accedere agli url solo avviare uno script e farlo funzionare per un periodo di tempo predefinito) e non salvare o emettere qualsiasi dato Pensi che causerà problemi in questo caso? – Rob

+0

La mia ipotesi è che non sarà un problema in questo caso, ma non lo so per certo - se non riesce a funzionare o errori quando tenti di caricarli tutti in una volta, potresti mettere un contatore nel ciclo 'while' e ogni volta che' counter% batch_size == 0' all'interno del ciclo, eseguire il batch e cancellarlo. – Isaac

+0

Woah. odio disturbarti con questo, ma potresti per favore commentare alcune cose in quel codice così posso vedere cosa fa esattamente tutto? – Rob