In PHP development, using the cURL library to make HTTP requests is quite common. When you need to handle multiple HTTP requests simultaneously, the curl_multi functions can greatly improve execution efficiency. To wait for active cURL transfers to complete efficiently, the curl_multi_select() function can be used.
<span class="fun">curl_multi_select(resource $mh[, float $timeout])</span>
The curl_multi_select() function waits for currently active cURL transfers to complete and returns the number of readable handles. By using this function, scripts can remain active during waiting periods, improving overall execution efficiency.
$mh = curl_multi_init();
$ch1 = curl_init();
curl_setopt($ch1, CURLOPT_URL, "https://example.com/api/request1");
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($mh, $ch1);
$ch2 = curl_init();
curl_setopt($ch2, CURLOPT_URL, "https://example.com/api/request2");
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($mh, $ch2);
do {
$status = curl_multi_exec($mh, $active);
if ($active) {
curl_multi_select($mh); // Wait for the active cURL transfer to complete
}
} while ($active && $status == CURLM_OK);
// Close all handles after processing
foreach ([$ch1, $ch2] as $ch) {
curl_multi_remove_handle($mh, $ch);
curl_close($ch);
}
curl_multi_close($mh);
In this example, we first create a cURL multi handle and add two individual cURL requests to it. Then we use curl_multi_exec() to process the transfers and curl_multi_select() to wait for any active transfers to complete. The loop continues until all requests have finished. Finally, we clean up by closing all the cURL handles to free resources.
Using curl_multi_select() can significantly improve the efficiency of handling concurrent HTTP requests. In practice, make sure to properly handle timeouts and exceptions to avoid infinite waiting loops. Additionally, you can use curl_multi_info_read() to retrieve the result status of each request for better error handling.
curl_multi_select() is an essential PHP function for managing multiple concurrent HTTP requests. When used properly, it allows your scripts to stay active while waiting for network responses, improving performance and enhancing user experience.