Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

When is it best to check asynchronous cURL requests for completion?

Multiple cURL requests are better to be made in an asynchronous manner, that is without each of the requests waiting till all the previous requests have received responses. Another optimization in many cases would be starting to process a received response without waiting for other responses. However, the docs and official examples are not clear when it is both possible and as early as possible to check for completed requests (which is typically done using curl_multi_info_read function).

So when is the earliest point to check for completed requests? Or what is the optimal set of such points?

This is the example from the curl_multi_exec's page (comments in upper case are mine):

<?php

// create both cURL resources
$ch1 = curl_init();
$ch2 = curl_init();

// set URL and other appropriate options
curl_setopt($ch1, CURLOPT_URL, "http://lxr.php.net/");
curl_setopt($ch1, CURLOPT_HEADER, 0);
curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/");
curl_setopt($ch2, CURLOPT_HEADER, 0);

//create the multiple cURL handle
$mh = curl_multi_init();

//add the two handles
curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);

$active = null;
//execute the handles
do {
    $mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
// SHOULD REQUESTS BE CHECKED FOR COMPLETION HERE?
while ($active && $mrc == CURLM_OK) {
    if (curl_multi_select($mh) != -1) {
        // SHOULD REQUESTS BE CHECKED FOR COMPLETION HERE?
        do {
            $mrc = curl_multi_exec($mh, $active);
        } while ($mrc == CURLM_CALL_MULTI_PERFORM);
        // SHOULD REQUESTS BE CHECKED FOR COMPLETION HERE?
    }
    // SHOULD REQUESTS BE CHECKED FOR COMPLETION HERE?
}
// SHOULD REQUESTS BE CHECKED FOR COMPLETION HERE?

//close the handles
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);

?>
like image 705
Desmond Hume Avatar asked Nov 17 '25 22:11

Desmond Hume


1 Answers

First, to simplify your life the CURLM_CALL_MULTI_PERFORM return code isn't used in modern libcurls (not used in 7.20.0 or later).

Then, as long as 'active' is larger than zero there are at least one active transfer in progress so you can wait with checking curl_multi_info_read() if you want.

Or you can call curl_multi_info_read() immediately after every call to curl_multi_exec(), that's up to you!

like image 90
Daniel Stenberg Avatar answered Nov 19 '25 13:11

Daniel Stenberg