CURLM_CALL_MULTI_PERFORM已弃用

Ant*_*ore 4 php curl deprecated

    do {
        $mrc = curl_multi_exec($mc, $active);
    } while ($mrc == CURLM_CALL_MULTI_PERFORM);
Run Code Online (Sandbox Code Playgroud)

还有其他选择吗?卷曲版本7.27.0

Sud*_*oti 10

尝试像:

do {
    $mrc = curl_multi_exec($mc, $active);
} while ($active > 0);
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这可能会导致 100% CPU 核心负载。尝试添加 `curl_multi_select($mc)` 或至少类似 `usleep(20000)` 的内容(以防“select”在您的系统上失败)。 (2认同)

tho*_*ter 10

您应该保持代码不变,因为这仍然是调用 curl_multi_exec 的最佳方式。

常数本身仍然存在;在 Curl 7.20.0 及更高版本中根本不使用它。但是,更改是以这样的方式完成的,您之前的代码根本不需要修改,并且将继续工作。

在 Curl 7.20.0 之前, curl_multi_exec 一次只处理一个任务,调用之后可能还有其他任务可以立即执行而不会阻塞。为确保完成所有这些任务,您必须执行以下操作:

do {
    $mrc = curl_multi_exec($mc, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
Run Code Online (Sandbox Code Playgroud)

所有这一切都是在没有阻塞的情况下完成的,因为 CURLM_CALL_MULTI_PERFORM 仅在其他任务准备好完成时才返回,并且 curl 希望您立即再次调用它。

从 7.20.0 开始,Curl 意识到这很愚蠢,并且如果 curl_multi_exec(实际上是上游 curl 中的curl_multi_perform)需要一次做不止一件事,它应该在返回之前自己做所有事情。

因此,它不再需要返回 CURLM_CALL_MULTI_PERFORM。

今天,等价于上面的代码很简单,

curl_multi_exec($mc, $active);
Run Code Online (Sandbox Code Playgroud)

您不需要检查结果是否为 CURLM_CALL_MULTI_PERFORM 并再次调用该函数。

但是,为了同时支持旧版本和新版本的 Curl,您仍然需要检查返回码:

do {
    $mrc = curl_multi_exec($mc, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
Run Code Online (Sandbox Code Playgroud)

这正是您之前所做的。

为此,CURLM_CALL_MULTI_PERFORM 仍然作为符号存在。所以,让你的代码保持原样,新旧 Curl 一切都会好起来的。

为什么使用 $active 不一样

引用的第二个参数,在本例中为 $active,不能以同样的方式处理。$active 将始终返回 true,直到所有正在进行的 HTTP 请求都终止,无论是否有任何准备好立即处理的内容。因此,它不能用作您应该再次调用 curl_multi_exec 的指示符。它仅表明您希望将来对连接采取进一步措施。

使用 curl_multi 接口的通常原因是,您可以以非阻塞方式执行 HTTP 请求,以便您可以在等待发送或接收数据的同时执行其他任务 - 或者至少,因此您可以管理多个请求并在每个请求返回后立即处理。为了实现这一点,您将 curl_multi_exec 作为循环的一部分调用。如果有一些数据需要发送或接收, curl_multi_exec 会这样做。如果没有任何东西可以处理而您只是在等待,那么它什么都不做。在循环的其余部分,您可以完成其他任务和/或对 curl_multi_info_read 做出反应,指示其中一个请求已完成。

但是,如果您要执行以下操作

// Do NOT do this
do {
    $mrc = curl_multi_exec($mc, $active);
} while ($active);
Run Code Online (Sandbox Code Playgroud)

...然后,此循环将永远不会退出,直到所有挂起的 HTTP 请求终止,从而以阻塞方式运行,并且永远不会让您在等待时处理其他任务。

  • 加一以获得丰富的解释。谢谢你! (2认同)