为什么curl_multi_select和curl_multi_info_read相互矛盾?

had*_*ees 4 php curl curl-multi

当我运行以下代码时,在我看来curl_multi_select并且curl_multi_info_read相互矛盾.据我所知,它curl_multi_select应该是阻塞,直到curl_multi_exec有响应,但我还没有看到实际发生.

$url = "http://google.com";
$ch  = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_VERBOSE, TRUE);

$mc = curl_multi_init();
curl_multi_add_handle($mc, $ch);

do {
  $exec = curl_multi_exec($mc, $running);
} while ($exec == CURLM_CALL_MULTI_PERFORM);

$ready=curl_multi_select($mc, 100);
var_dump($ready);

$info = curl_multi_info_read($mc,$msgs);
var_dump($info);
Run Code Online (Sandbox Code Playgroud)

这回来了

int 1
boolean false
Run Code Online (Sandbox Code Playgroud)

这似乎与自己相矛盾.怎么可以准备好,没有任何消息?

我正在使用的php版本是5.3.9

flm*_*flm 5

基本上curl_multi_select阻止,直到有东西可读curl_multi_exec.如果你curl_multi_exec不使用curl_multi_select这个循环就会占用100%的CPU.因此curl_multi_info_read用于检查是否有任何传输已经结束(正确或有错误).

使用多句柄的代码应遵循以下模式:

do
{
    $mrc = curl_multi_exec($this->mh, $active);
}
while ($mrc == CURLM_CALL_MULTI_PERFORM);

while ($active && $mrc == CURLM_OK)
{
    curl_multi_select($this->mh);
    do
    {
        $mrc = curl_multi_exec($this->mh, $active);
    }
    while ($mrc == CURLM_CALL_MULTI_PERFORM);
    while ($info = curl_multi_info_read($this->mh))
    {
        $this->process_ch($info);
    }
}
Run Code Online (Sandbox Code Playgroud)

另请参阅:以正确的方式执行curl_multi_exec.