最好以异步方式进行多个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);
?>
答案 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(),这取决于您!