Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana saya bisa menggunakan cURL untuk membuka banyak URL secara bersamaan dengan PHP?

Anda menyiapkan setiap pegangan cURL dengan cara yang sama, lalu menambahkannya ke curl_multi_ menangani. Fungsi yang harus dilihat adalah curl_multi_* fungsi didokumentasikan di sini . Dalam pengalaman saya, ada masalah dengan mencoba memuat terlalu banyak URL sekaligus (meskipun saya tidak dapat menemukan catatan saya saat ini), jadi terakhir kali saya menggunakan curl_mutli_ , saya menyiapkannya untuk melakukan kumpulan 5 URL sekaligus.

edit :Ini adalah versi pengurangan dari kode yang saya gunakan curl_multi_ :

edit :Sedikit ditulis ulang dan banyak menambahkan komentar, semoga membantu.

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

Mengingat bahwa Anda tidak memerlukan apa pun kembali dari URL, Anda mungkin tidak membutuhkan banyak dari apa yang ada di sana, tetapi beginilah cara saya membagi permintaan ke dalam blok BLOCK_SIZE , menunggu setiap blok berjalan sebelum melanjutkan, dan menangkap kesalahan dari cURL.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Query MySQL dan Sphinx campuran

  2. mysqldump - Ekspor struktur saja tanpa peningkatan otomatis

  3. Kesalahan fatal:Tidak dapat menggunakan objek bertipe stdClass sebagai array di

  4. Pernyataan yang disiapkan PDO ini mengembalikan false tetapi tidak menimbulkan kesalahan

  5. TypeError:Objek 'NoneType' tidak dapat disubscript di Flask, aplikasi mysql