2010-04-22 13 views
10

İşte şu anki kodum:PHP ile aynı anda birden çok URL açmak için cURL'yi nasıl kullanabilirim?

 $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 

CURL için nispeten yeni. Nispeten yeni, demek istediğim bu benim cURL kullanarak ilk defa. Şu anda bir iki saniye için bir tane yükler, sonra bir sonraki 2 saniye için, sonra bir sonraki yükler. bununla birlikte, aynı zamanda TÜMÜNÜN hepsini yüklemesini istiyorum. Eminim mümkün, sadece nasıl olduğuna emin değilim. Biri bana doğru yönde işaret ederse, minnettar olurum.

+0

Sonuçların kıvrılma yükleriyle ilgili bir şey yapmanıza gerek var mı? –

+0

Hayır. Hiç bir şey yok. – Rob

cevap

8

Her cURL tutamacını aynı şekilde ayarladıktan sonra bunları bir curl_multi_ tanıtıcısına ekleyin. Bakılacak işlevler, documented here numaralı curl_multi_* işlevlerdir. Ancak, benim deneyimime göre, çok fazla sayıda URL'yi aynı anda yüklemeye çalışmakla ilgili sorunlar vardı (ancak şu anda notlarımı bulamıyorum), bu yüzden son kez curl_mutli_'u kullandım. Bir seferde 5 URL.

düzenlemek:

düzenlemek: İşte curl_multi_ kullanarak gelmiş bir kod azaltılmış versiyonu Biraz yeniden yazılmış ve umarım yardımcı olacaktır eklenen yorumların bir sürü.

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

geri URL'leri şey gerekmez göre büyük olasılıkla orada ne bir sürü gerekmez göz önüne alındığında, ama bu, BLOCK_SIZE bloklar halinde istekleri yığın halinde her blok için bekledi nasıl devam etmeden önce koşun ve cURL'den hatalar yakalayın.

+0

Tamamen yapacağım her url (ve yüklenecek URL'ler boş sayfalar, URL'lere erişme sadece bir betik başlatma ve önceden ayarlanmış bir süre için çalışmasını sağlama) ve kaydetme veya çıktı alma herhangi bir veri. Bu durumda herhangi bir soruna neden olacağını düşünüyor musunuz? – Rob

+0

Tahminimce, bu durumda bir sorun olmayacak, ama emin değilim - eğer hepsini bir kerede yüklemeye çalıştığınızda, hata veremiyorsa veya hata veriyorsa, bir sayaç koyabilirsiniz 'while' döngüsünüzde ve döngü içinde% batch_size == 0 'sayacındayken, partiyi çalıştırın ve temizleyin. – Isaac

+0

Woah. Bu konuda sizi rahatsız etmekten nefret ediyorum, ancak bu kodda bazı şeyleri yorumlayabiliyor musunuz? Böylece her şeyin tam olarak ne yaptığını görebiliyor muyum? – Rob

İlgili konular