CURLM_CALL_MULTI_PERFORM 已被弃用。
do {
$mrc = curl_multi_exec($mc, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
有没有其他选择?卷曲版本 7.27.0
CURLM_CALL_MULTI_PERFORM 已被弃用。
do {
$mrc = curl_multi_exec($mc, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
有没有其他选择?卷曲版本 7.27.0
您应该保留您的代码,因为这仍然是调用 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 请求终止,从而以阻塞方式运行,并且永远不会让您在等待时参与其他任务。
试试看:
do {
$mrc = curl_multi_exec($mc, $active);
} while ($active > 0);