gpt4 book ai didi

php - 为什么 curl_multi_select 和 curl_multi_info_read 相互矛盾?

转载 作者:可可西里 更新时间:2023-10-31 22:57:41 25 4
gpt4 key购买 nike

当我运行下面的代码时,在我看来 curl_multi_selectcurl_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 .

关于php - 为什么 curl_multi_select 和 curl_multi_info_read 相互矛盾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10148979/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com