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 秒的阻塞,这可能会有所帮助。

手册页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.20 的 Amazon 实例上运行,因为PHP 5.3.18 中的这个错误导致调用curl_multi_select()永远不会返回除了-1

现在,我可以使用 200 个句柄在 30 秒内从近 1,300 个 URL 中检索数据。

于 2013-03-25T10:45:59.757 回答