3

Windows XP PHP 5.3.5 でPHP から例 #1 を実行すると、指定されたタイムアウトの間、curl_multi_select()行は常にブロックされます (空白の場合は 1 秒間ブロックされ、5 秒のタイムアウトを指定すると 5 秒間ブロックされます)。コンテンツを取得するのにかかる時間。このバグに関連していると思われます。

問題は次のとおりです。最善の回避策は何ですか? 私が思いつく最善の方法は、いくつかのサイクルを節約する方法として、curl_multi_select()およびを取り除くことです。usleep(x)

4

1 に答える 1

3

これは、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 からデータを取得できるようになりました。

于 2013-03-25T10:45:59.757 に答える