Php CURLM_CALL_MULTI_PERFORM已弃用

Php CURLM_CALL_MULTI_PERFORM已弃用,php,curl,deprecated,Php,Curl,Deprecated,CURLM_调用_MULTI_执行 还有别的选择吗? Curl 7.27.0版试试看: do { $mrc = curl_multi_exec($mc, $active); } while ($active > 0); 现在还不清楚CURLM_CALL_MULTI_PERFORM是否被弃用 符号 报告中没有提到搬迁 正如@tne在他的评论中指出的:忽略它似乎是合理的。您应该保持代码的原样,因为这仍然是调用curl\u multi\u exec的最佳方式 常数本身仍然存在;在cur

CURLM_调用_MULTI_执行

还有别的选择吗? Curl 7.27.0版

试试看:

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

现在还不清楚CURLM_CALL_MULTI_PERFORM是否被弃用

符号 报告中没有提到搬迁


正如@tne在他的评论中指出的:忽略它似乎是合理的。

您应该保持代码的原样,因为这仍然是调用curl\u multi\u exec的最佳方式

常数本身仍然存在;在curl7.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中)需要同时做多件事情,那么它应该在返回之前自己完成所有事情

因此,它不再需要返回CURLM_CALL_MULTI_PERFORM

今天,与上述代码等价的是

curl_multi_exec($mc, $active);
您不需要检查结果是否为CURLM\u CALL\u MULTI\u 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\u multi\u exec。它所表明的是,您希望将来对连接采取进一步的行动

使用curl_multi接口的通常原因是,您可以以非阻塞方式执行HTTP请求,以便在等待发送或接收数据时可以执行其他任务,或者至少可以并行管理多个请求,并在每个请求返回时立即处理。要实现这一点,可以将curl\u multi\u exec作为循环的一部分调用。如果需要发送或接收某些数据,curl_multi_exec将执行此操作。如果没有准备好处理,而您只是在等待,那么它将什么也不做。在循环的其余部分,您可以完成其他任务和/或响应curl_multi_info_read,指示其中一个请求已完成

但是,如果你要做以下事情

// Do NOT do this
do {
    $mrc = curl_multi_exec($mc, $active);
} while ($active);

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

这肯定会让人困惑;错误代码的文档中说:“在7.20.0版本之前,这可以由curl_multi_perform返回,但在更高的版本中,此返回代码从未被使用。”()——在7.22.0中,他们假定删除了它的测试:“libtests:停止检查CURLM_CALL_multi_perform”()。我猜它处于某种不确定的状态,没有官方的反对意见,但从未使用过,也没有明确的记录。忽略它似乎是合理的。不要相信我的话,但我假设他们只是直接在
\u perform
中迭代任何不需要阻塞的内容(我认为它是由PHP的
\u exec
包装的),而不将控制权返回给用户代码,直到没有任何可以立即执行的操作为止(我假设你没有理由需要在这些过程之间进行控制)。因此,你可以忽略它,“替代方案”应该是内置的。请注意,这可能会导致100%的CPU核心负载。请尝试添加
curl\u multi\u select($mc)
,或者至少添加类似
usleep(20000)
(以防万一)“选择”在您的系统上失败)。不,$active有不同的用途,这样做并不等同于此,它将100%束缚机器,并阻止您在请求完成时执行任何其他操作。有关解释,请参阅我的新答案。但简言之,您应该继续保持代码不变,并且仍然检查结果是否为CURLM_CALL_MULTI_PERFORM,并调用函数当且仅当这是一个结果时,请再次使用ion。接受的答案是错误的,并且会破坏东西,请查看其他答案以进行解释。加上1以获得丰富的解释。谢谢!
// Do NOT do this
do {
    $mrc = curl_multi_exec($mc, $active);
} while ($active);