什么时候最好检查异步cURL请求完成?

时间:2013-12-26 13:35:56

标签: php curl asynchronous

最好以异步方式进行多个cURL请求,即每个请求都等待所有先前的请求都收到响应。在许多情况下,另一个优化是开始处理收到的响应而不等待其他响应。但是,如果有可能尽可能早地检查已完成的请求(通常使用curl_multi_info_read函数完成),则文档和官方示例并不清楚。

那么检查已完成的请求的最早时间是什么时候?或者这些点的最佳组合是什么?

这是curl_multi_exec页面中的示例(大写的评论是我的):

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

?>

1 个答案:

答案 0 :(得分:2)

首先,为了简化你的生活,现代libcurls中的CURLM_CALL_MULTI_PERFORM return code isn't used(未在7.20.0或更高版本中使用)。

然后,只要“活跃”&#39;大于零时,至少有一个正在进行的活动转移,因此您可以等待检查curl_multi_info_read(),如果需要。

或者,您可以在每次致电curl_multi_info_read()后立即致电curl_multi_exec(),这取决于您!