php curl 堵塞,PHP的-curl_multi_select总是阻塞超时值

栾钟展
2023-12-01

在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

 类似资料: