在Windows XP PHP 5.3.5上运行Example #1 from PHP时,curl_multi_select()行将始终在指定的超时时间内阻塞(如果为空白,它将阻塞1秒钟,如果我指定5秒钟,它将阻塞5秒钟),无论获取内容所需的时间.我怀疑与this bug有关.
问题是:最好的解决方法是什么?我能想到的最好的方法是摆脱curl_multi_select()和usleep(x)作为节省周期的一种方式.
解决方法:
只要您可以忍受1秒钟的阻塞,这可能会有所帮助.
在manual page for 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);
在进行此修改之前,由于this bug in PHP 5.3.18,使用PHP 5.4测试的代码无法在运行PHP 5.3.20的Amazon实例上运行,这导致对curl_multi_select()的调用永远不会返回-1
现在,我可以使用200个句柄在不到30秒的时间内从近1300个URL中检索数据.
标签:curl,curl-multi,php
来源: https://codeday.me/bug/20191201/2080253.html