from file_get_contents content php mysql curl curl-multi

file_get_contents - php get url content



¿Cómo puedo usar cURL para abrir varias URL simultáneamente con PHP? (1)

Aquí está mi código actual:

$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

Soy relativamente nuevo en cURL. Por relativamente nuevo, me refiero a que esta es la primera vez que uso cURL. Actualmente carga uno por dos segundos, luego carga el siguiente durante 2 segundos, luego el siguiente. sin embargo, quiero que cargue TODOS al mismo tiempo. Estoy seguro de que es posible, no estoy seguro de cómo. Si alguien pudiera señalarme en la dirección correcta, lo agradecería.


Configura cada identificador de CURL de la misma manera y luego los agrega a un controlador curl_multi_ . Las funciones a observar son las funciones curl_multi_* documentadas aquí . En mi experiencia, sin embargo, hubo problemas al tratar de cargar demasiadas URL a la vez (aunque no puedo encontrar mis notas en este momento), así que la última vez que utilicé curl_mutli_ , lo configuré para hacer lotes de 5 URL a la vez.

editar : Aquí hay una versión reducida del código que tengo usando curl_multi_ :

editar : ligeramente reescrito y muchos comentarios añadidos, lo que con suerte ayudará.

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

Dado que no necesita nada de las URL, probablemente no necesite mucho de lo que hay allí, pero así es como clasifiqué las solicitudes en bloques de BLOCK_SIZE , esperé que cada bloque se ejecutara antes de continuar y atrapé errores de cURL.