これは、1 秒のブロックに耐えることができる限り、役立つ可能性があります。
少なくとも 1 つの接続が完了するまで、または数秒のうち、最初に発生した方まで、このブロックが続くことについて言及しているマニュアル ページにcurl_multi_select
コメントがあります。$timeout
彼らはまた、への呼び出しをcurl_multi_select
ラップする必要があると書いています。
private function full_curl_multi_exec($mh, &$still_running) {
do {
$rv = curl_multi_exec($mh, $still_running);
} while ($rv == CURLM_CALL_MULTI_PERFORM);
return $rv;
}
次に、実行中のハンドルをチェックするループを変更します。
// execute the handles
$still_running = null;
$this->full_curl_multi_exec($mh, $still_running);
// check whether the handles have finished
do { // "wait for completion"-loop
curl_multi_select($mh); // non-busy (!) wait for state change
$this->full_curl_multi_exec($mh, $still_running); // get new state
while ($info = curl_multi_info_read($mh)) {
// process completed request (e.g. curl_multi_getcontent($info['handle']))
}
} while ($still_running);
この変更の前に、PHP 5.4 でテストされたコードは、PHP 5.3.18 のこのバグにより、PHP 5.3.20を実行している Amazon インスタンスで動作curl_multi_select()
しませんでした。-1
200 ハンドルのバッチを使用して、30 秒未満で 1,300 近くの URL からデータを取得できるようになりました。