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 中實現平行處理的較好方式之一。