当我运行下面的代码时,在我看来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);
这种回报
int 1
boolean false
这似乎自相矛盾。它怎么能准备好而没有任何消息呢?
我使用的php版本是5.3.9
最佳答案
基本上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);
}
}
另请参见:Doing curl_multi_exec the right way。