8

CURLM_CALL_MULTI_PERFORM 已被弃用

    do {
        $mrc = curl_multi_exec($mc, $active);
    } while ($mrc == CURLM_CALL_MULTI_PERFORM);

有没有其他选择?卷曲版本 7.27.0

4

3 回答 3

12

您应该保留您的代码,因为这仍然是调用 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);

所有这一切都是在没有阻塞的情况下完成的,因为 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);

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

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

do {
    $mrc = curl_multi_exec($mc, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);

这正是你之前所做的。

为此,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);

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

于 2020-04-07T03:31:50.137 回答
10

试试看:

do {
    $mrc = curl_multi_exec($mc, $active);
} while ($active > 0);
于 2013-10-21T09:41:46.420 回答
1

目前还不清楚,是否不推荐使用 CURLM_CALL_MULTI_PERFORM。

符号存在7.27.0 变更说明 中没有提到删除。

就像@tne 在他的评论中指出的那样:忽略它似乎是合理的。

于 2014-09-09T16:22:20.607 回答