加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 为什么curl_multi_select和curl_multi_info_read相互矛盾

发布时间:2020-12-13 17:18:55 所属栏目:PHP教程 来源:网络整理
导读:当我运行下面的代码时,我觉得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_RETU
当我运行下面的代码时,我觉得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_select的情况下循环curl_multi_exec,这将占用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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读