当我运行以下代码时,我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
答案 0 :(得分: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);
}
}
答案 1 :(得分:0)
来自spec:
询问多手柄是否有来自个别转移的任何消息或信息。消息可能包含来自传输的错误代码或传输完成的信息。
1可能意味着有活动,但不一定等待消息:在这种情况下,可能是您的某些下载数据可用,但不是全部。 curl_multi_select doc中的示例显式测试curl_multi_info_read
的错误值。