curl_multi_select($mh, $timeout) 只是在 curl_multi_exec() 返回 CURLM_CALL_MULTI_PERFORM 时阻塞 $timeout 秒。否则,它按预期工作,并阻塞,直到至少有一个连接完成或 $timeout 秒,以先发生者为准。
因此,curl_multi_exec() 应该始终被包装
<?php
function full_curl_multi_exec($mh, &$still_running) {
do {
$rv = curl_multi_exec($mh, $still_running);
} while ($rv == CURLM_CALL_MULTI_PERFORM);
return $rv;
}
?>
这样,“多路复用”处理的核心就变成了(为了简洁起见,忽略了错误处理)
<?php
full_curl_multi_exec($mh, $still_running); do { curl_multi_select($mh); full_curl_multi_exec($mh, $still_running); while ($info = curl_multi_info_read($mh)) {
}
} while ($still_running);
?>
请注意,在启动请求后,检索在后台进行 - 这是在 PHP 中进行并行处理的最佳方法之一。